/*
jd宠汪汪 搬的https://github.com/uniqueque/QuantumultX/blob/4c1572d93d4d4f883f483f907120a75d925a693e/Script/jd_joy.js
脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
IOS用户支持京东双账号,NodeJs用户支持N个京东账号
更新时间：2021-6-6
活动入口：京东APP我的-更多工具-宠汪汪
建议先凌晨0点运行jd_joy.js脚本获取狗粮后，再运行此脚本(jd_joy_steal.js)可偷好友积分，6点运行可偷好友狗粮
feedCount:自定义 每次喂养数量; 等级只和喂养次数有关，与数量无关
推荐每次投喂10个，积累狗粮，然后去玩聚宝盆赌
Combine from Zero-S1/JD_tools(https://github.com/Zero-S1/JD_tools)
==========Quantumult X==========
[task_local]
#京东宠汪汪
15 0-23/2 * * * jd_joy.js, tag=京东宠汪汪, img-url=https://raw.githubusercontent.com/58xinian/icon/master/jdcww.png, enabled=true

============Loon===========
[Script]
cron "15 0-23/2 * * *" script-path=jd_joy.js,tag=京东宠汪汪

============Surge==========
[Script]
京东宠汪汪 = type=cron,cronexp="15 0-23/2 * * *",wake-system=1,timeout=3600,script-path=jd_joy.js

===============小火箭==========
京东宠汪汪 = type=cron,script-path=jd_joy.js, cronexpr="15 0-23/2 * * *", timeout=3600, enable=true
*/
! function(t, r) {
  "object" == typeof exports ? module.exports = exports = r() : "function" == typeof define && define.amd ? define([], r) : t.CryptoJS = r()
}(this, function() {
  var t = t || function(t, r) {
      var e = Object.create || function() {
              function t() {}
              return function(r) {
                  var e;
                  return t.prototype = r, e = new t, t.prototype = null, e
              }
          }(),
          i = {},
          n = i.lib = {},
          o = n.Base = function() {
              return {
                  extend: function(t) {
                      var r = e(this);
                      return t && r.mixIn(t), r.hasOwnProperty("init") && this.init !== r.init || (r.init = function() {
                          r.$super.init.apply(this, arguments)
                      }), r.init.prototype = r, r.$super = this, r
                  },
                  create: function() {
                      var t = this.extend();
                      return t.init.apply(t, arguments), t
                  },
                  init: function() {},
                  mixIn: function(t) {
                      for (var r in t) t.hasOwnProperty(r) && (this[r] = t[r]);
                      t.hasOwnProperty("toString") && (this.toString = t.toString)
                  },
                  clone: function() {
                      return this.init.prototype.extend(this)
                  }
              }
          }(),
          s = n.WordArray = o.extend({
              init: function(t, e) {
                  t = this.words = t || [], e != r ? this.sigBytes = e : this.sigBytes = 4 * t.length
              },
              toString: function(t) {
                  return (t || c).stringify(this)
              },
              concat: function(t) {
                  var r = this.words,
                      e = t.words,
                      i = this.sigBytes,
                      n = t.sigBytes;
                  if (this.clamp(), i % 4)
                      for (var o = 0; o < n; o++) {
                          var s = e[o >>> 2] >>> 24 - o % 4 * 8 & 255;
                          r[i + o >>> 2] |= s << 24 - (i + o) % 4 * 8
                      } else
                          for (var o = 0; o < n; o += 4) r[i + o >>> 2] = e[o >>> 2];
                  return this.sigBytes += n, this
              },
              clamp: function() {
                  var r = this.words,
                      e = this.sigBytes;
                  r[e >>> 2] &= 4294967295 << 32 - e % 4 * 8, r.length = t.ceil(e / 4)
              },
              clone: function() {
                  var t = o.clone.call(this);
                  return t.words = this.words.slice(0), t
              },
              random: function(r) {
                  for (var e, i = [], n = function(r) {
                          var r = r,
                              e = 987654321,
                              i = 4294967295;
                          return function() {
                              e = 36969 * (65535 & e) + (e >> 16) & i, r = 18e3 * (65535 & r) + (r >> 16) & i;
                              var n = (e << 16) + r & i;
                              return n /= 4294967296, n += .5, n * (t.random() > .5 ? 1 : -1)
                          }
                      }, o = 0; o < r; o += 4) {
                      var a = n(4294967296 * (e || t.random()));
                      e = 987654071 * a(), i.push(4294967296 * a() | 0)
                  }
                  return new s.init(i, r)
              }
          }),
          a = i.enc = {},
          c = a.Hex = {
              stringify: function(t) {
                  for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n++) {
                      var o = r[n >>> 2] >>> 24 - n % 4 * 8 & 255;
                      i.push((o >>> 4).toString(16)), i.push((15 & o).toString(16))
                  }
                  return i.join("")
              },
              parse: function(t) {
                  for (var r = t.length, e = [], i = 0; i < r; i += 2) e[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4;
                  return new s.init(e, r / 2)
              }
          },
          h = a.Latin1 = {
              stringify: function(t) {
                  for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n++) {
                      var o = r[n >>> 2] >>> 24 - n % 4 * 8 & 255;
                      i.push(String.fromCharCode(o))
                  }
                  return i.join("")
              },
              parse: function(t) {
                  for (var r = t.length, e = [], i = 0; i < r; i++) e[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - i % 4 * 8;
                  return new s.init(e, r)
              }
          },
          l = a.Utf8 = {
              stringify: function(t) {
                  try {
                      return decodeURIComponent(escape(h.stringify(t)))
                  } catch (t) {
                      throw new Error("Malformed UTF-8 data")
                  }
              },
              parse: function(t) {
                  return h.parse(unescape(encodeURIComponent(t)))
              }
          },
          f = n.BufferedBlockAlgorithm = o.extend({
              reset: function() {
                  this._data = new s.init, this._nDataBytes = 0
              },
              _append: function(t) {
                  "string" == typeof t && (t = l.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes
              },
              _process: function(r) {
                  var e = this._data,
                      i = e.words,
                      n = e.sigBytes,
                      o = this.blockSize,
                      a = 4 * o,
                      c = n / a;
                  c = r ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0);
                  var h = c * o,
                      l = t.min(4 * h, n);
                  if (h) {
                      for (var f = 0; f < h; f += o) this._doProcessBlock(i, f);
                      var u = i.splice(0, h);
                      e.sigBytes -= l
                  }
                  return new s.init(u, l)
              },
              clone: function() {
                  var t = o.clone.call(this);
                  return t._data = this._data.clone(), t
              },
              _minBufferSize: 0
          }),
          u = (n.Hasher = f.extend({
              cfg: o.extend(),
              init: function(t) {
                  this.cfg = this.cfg.extend(t), this.reset()
              },
              reset: function() {
                  f.reset.call(this), this._doReset()
              },
              update: function(t) {
                  return this._append(t), this._process(), this
              },
              finalize: function(t) {
                  t && this._append(t);
                  var r = this._doFinalize();
                  return r
              },
              blockSize: 16,
              _createHelper: function(t) {
                  return function(r, e) {
                      return new t.init(e).finalize(r)
                  }
              },
              _createHmacHelper: function(t) {
                  return function(r, e) {
                      return new u.HMAC.init(t, e).finalize(r)
                  }
              }
          }), i.algo = {});
      return i
  }(Math);
  return function() {
          function r(t, r, e) {
              for (var i = [], o = 0, s = 0; s < r; s++)
                  if (s % 4) {
                      var a = e[t.charCodeAt(s - 1)] << s % 4 * 2,
                          c = e[t.charCodeAt(s)] >>> 6 - s % 4 * 2;
                      i[o >>> 2] |= (a | c) << 24 - o % 4 * 8, o++
                  }
              return n.create(i, o)
          }
          var e = t,
              i = e.lib,
              n = i.WordArray,
              o = e.enc;
          o.Base64 = {
              stringify: function(t) {
                  var r = t.words,
                      e = t.sigBytes,
                      i = this._map;
                  t.clamp();
                  for (var n = [], o = 0; o < e; o += 3)
                      for (var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255, a = r[o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255, c = r[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, h = s << 16 | a << 8 | c, l = 0; l < 4 && o + .75 * l < e; l++) n.push(i.charAt(h >>> 6 * (3 - l) & 63));
                  var f = i.charAt(64);
                  if (f)
                      for (; n.length % 4;) n.push(f);
                  return n.join("")
              },
              parse: function(t) {
                  var e = t.length,
                      i = this._map,
                      n = this._reverseMap;
                  if (!n) {
                      n = this._reverseMap = [];
                      for (var o = 0; o < i.length; o++) n[i.charCodeAt(o)] = o
                  }
                  var s = i.charAt(64);
                  if (s) {
                      var a = t.indexOf(s);
                      a !== -1 && (e = a)
                  }
                  return r(t, e, n)
              },
              _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
          }
      }(),
      function(r) {
          function e(t, r, e, i, n, o, s) {
              var a = t + (r & e | ~r & i) + n + s;
              return (a << o | a >>> 32 - o) + r
          }

          function i(t, r, e, i, n, o, s) {
              var a = t + (r & i | e & ~i) + n + s;
              return (a << o | a >>> 32 - o) + r
          }

          function n(t, r, e, i, n, o, s) {
              var a = t + (r ^ e ^ i) + n + s;
              return (a << o | a >>> 32 - o) + r
          }

          function o(t, r, e, i, n, o, s) {
              var a = t + (e ^ (r | ~i)) + n + s;
              return (a << o | a >>> 32 - o) + r
          }
          var s = t,
              a = s.lib,
              c = a.WordArray,
              h = a.Hasher,
              l = s.algo,
              f = [];
          ! function() {
              for (var t = 0; t < 64; t++) f[t] = 4294967296 * r.abs(r.sin(t + 1)) | 0
          }();
          var u = l.MD5 = h.extend({
              _doReset: function() {
                  this._hash = new c.init([1732584193, 4023233417, 2562383102, 271733878])
              },
              _doProcessBlock: function(t, r) {
                  for (var s = 0; s < 16; s++) {
                      var a = r + s,
                          c = t[a];
                      t[a] = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8)
                  }
                  var h = this._hash.words,
                      l = t[r + 0],
                      u = t[r + 1],
                      d = t[r + 2],
                      v = t[r + 3],
                      p = t[r + 4],
                      _ = t[r + 5],
                      y = t[r + 6],
                      g = t[r + 7],
                      B = t[r + 8],
                      w = t[r + 9],
                      k = t[r + 10],
                      S = t[r + 11],
                      m = t[r + 12],
                      x = t[r + 13],
                      b = t[r + 14],
                      H = t[r + 15],
                      z = h[0],
                      A = h[1],
                      C = h[2],
                      D = h[3];
                  z = e(z, A, C, D, l, 7, f[0]), D = e(D, z, A, C, u, 12, f[1]), C = e(C, D, z, A, d, 17, f[2]), A = e(A, C, D, z, v, 22, f[3]), z = e(z, A, C, D, p, 7, f[4]), D = e(D, z, A, C, _, 12, f[5]), C = e(C, D, z, A, y, 17, f[6]), A = e(A, C, D, z, g, 22, f[7]), z = e(z, A, C, D, B, 7, f[8]), D = e(D, z, A, C, w, 12, f[9]), C = e(C, D, z, A, k, 17, f[10]), A = e(A, C, D, z, S, 22, f[11]), z = e(z, A, C, D, m, 7, f[12]), D = e(D, z, A, C, x, 12, f[13]), C = e(C, D, z, A, b, 17, f[14]), A = e(A, C, D, z, H, 22, f[15]), z = i(z, A, C, D, u, 5, f[16]), D = i(D, z, A, C, y, 9, f[17]), C = i(C, D, z, A, S, 14, f[18]), A = i(A, C, D, z, l, 20, f[19]), z = i(z, A, C, D, _, 5, f[20]), D = i(D, z, A, C, k, 9, f[21]), C = i(C, D, z, A, H, 14, f[22]), A = i(A, C, D, z, p, 20, f[23]), z = i(z, A, C, D, w, 5, f[24]), D = i(D, z, A, C, b, 9, f[25]), C = i(C, D, z, A, v, 14, f[26]), A = i(A, C, D, z, B, 20, f[27]), z = i(z, A, C, D, x, 5, f[28]), D = i(D, z, A, C, d, 9, f[29]), C = i(C, D, z, A, g, 14, f[30]), A = i(A, C, D, z, m, 20, f[31]), z = n(z, A, C, D, _, 4, f[32]), D = n(D, z, A, C, B, 11, f[33]), C = n(C, D, z, A, S, 16, f[34]), A = n(A, C, D, z, b, 23, f[35]), z = n(z, A, C, D, u, 4, f[36]), D = n(D, z, A, C, p, 11, f[37]), C = n(C, D, z, A, g, 16, f[38]), A = n(A, C, D, z, k, 23, f[39]), z = n(z, A, C, D, x, 4, f[40]), D = n(D, z, A, C, l, 11, f[41]), C = n(C, D, z, A, v, 16, f[42]), A = n(A, C, D, z, y, 23, f[43]), z = n(z, A, C, D, w, 4, f[44]), D = n(D, z, A, C, m, 11, f[45]), C = n(C, D, z, A, H, 16, f[46]), A = n(A, C, D, z, d, 23, f[47]), z = o(z, A, C, D, l, 6, f[48]), D = o(D, z, A, C, g, 10, f[49]), C = o(C, D, z, A, b, 15, f[50]), A = o(A, C, D, z, _, 21, f[51]), z = o(z, A, C, D, m, 6, f[52]), D = o(D, z, A, C, v, 10, f[53]), C = o(C, D, z, A, k, 15, f[54]), A = o(A, C, D, z, u, 21, f[55]), z = o(z, A, C, D, B, 6, f[56]), D = o(D, z, A, C, H, 10, f[57]), C = o(C, D, z, A, y, 15, f[58]), A = o(A, C, D, z, x, 21, f[59]), z = o(z, A, C, D, p, 6, f[60]), D = o(D, z, A, C, S, 10, f[61]), C = o(C, D, z, A, d, 15, f[62]), A = o(A, C, D, z, w, 21, f[63]), h[0] = h[0] + z | 0, h[1] = h[1] + A | 0, h[2] = h[2] + C | 0, h[3] = h[3] + D | 0
              },
              _doFinalize: function() {
                  var t = this._data,
                      e = t.words,
                      i = 8 * this._nDataBytes,
                      n = 8 * t.sigBytes;
                  e[n >>> 5] |= 128 << 24 - n % 32;
                  var o = r.floor(i / 4294967296),
                      s = i;
                  e[(n + 64 >>> 9 << 4) + 15] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), e[(n + 64 >>> 9 << 4) + 14] = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), t.sigBytes = 4 * (e.length + 1), this._process();
                  for (var a = this._hash, c = a.words, h = 0; h < 4; h++) {
                      var l = c[h];
                      c[h] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8)
                  }
                  return a
              },
              clone: function() {
                  var t = h.clone.call(this);
                  return t._hash = this._hash.clone(), t
              }
          });
          s.MD5 = h._createHelper(u), s.HmacMD5 = h._createHmacHelper(u)
      }(Math),
      function() {
          var r = t,
              e = r.lib,
              i = e.WordArray,
              n = e.Hasher,
              o = r.algo,
              s = [],
              a = o.SHA1 = n.extend({
                  _doReset: function() {
                      this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
                  },
                  _doProcessBlock: function(t, r) {
                      for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], a = e[3], c = e[4], h = 0; h < 80; h++) {
                          if (h < 16) s[h] = 0 | t[r + h];
                          else {
                              var l = s[h - 3] ^ s[h - 8] ^ s[h - 14] ^ s[h - 16];
                              s[h] = l << 1 | l >>> 31
                          }
                          var f = (i << 5 | i >>> 27) + c + s[h];
                          f += h < 20 ? (n & o | ~n & a) + 1518500249 : h < 40 ? (n ^ o ^ a) + 1859775393 : h < 60 ? (n & o | n & a | o & a) - 1894007588 : (n ^ o ^ a) - 899497514, c = a, a = o, o = n << 30 | n >>> 2, n = i, i = f
                      }
                      e[0] = e[0] + i | 0, e[1] = e[1] + n | 0, e[2] = e[2] + o | 0, e[3] = e[3] + a | 0, e[4] = e[4] + c | 0
                  },
                  _doFinalize: function() {
                      var t = this._data,
                          r = t.words,
                          e = 8 * this._nDataBytes,
                          i = 8 * t.sigBytes;
                      return r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 64 >>> 9 << 4) + 14] = Math.floor(e / 4294967296), r[(i + 64 >>> 9 << 4) + 15] = e, t.sigBytes = 4 * r.length, this._process(), this._hash
                  },
                  clone: function() {
                      var t = n.clone.call(this);
                      return t._hash = this._hash.clone(), t
                  }
              });
          r.SHA1 = n._createHelper(a), r.HmacSHA1 = n._createHmacHelper(a)
      }(),
      function(r) {
          var e = t,
              i = e.lib,
              n = i.WordArray,
              o = i.Hasher,
              s = e.algo,
              a = [],
              c = [];
          ! function() {
              function t(t) {
                  for (var e = r.sqrt(t), i = 2; i <= e; i++)
                      if (!(t % i)) return !1;
                  return !0
              }

              function e(t) {
                  return 4294967296 * (t - (0 | t)) | 0
              }
              for (var i = 2, n = 0; n < 64;) t(i) && (n < 8 && (a[n] = e(r.pow(i, .5))), c[n] = e(r.pow(i, 1 / 3)), n++), i++
          }();
          var h = [],
              l = s.SHA256 = o.extend({
                  _doReset: function() {
                      this._hash = new n.init(a.slice(0))
                  },
                  _doProcessBlock: function(t, r) {
                      for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], s = e[3], a = e[4], l = e[5], f = e[6], u = e[7], d = 0; d < 64; d++) {
                          if (d < 16) h[d] = 0 | t[r + d];
                          else {
                              var v = h[d - 15],
                                  p = (v << 25 | v >>> 7) ^ (v << 14 | v >>> 18) ^ v >>> 3,
                                  _ = h[d - 2],
                                  y = (_ << 15 | _ >>> 17) ^ (_ << 13 | _ >>> 19) ^ _ >>> 10;
                              h[d] = p + h[d - 7] + y + h[d - 16]
                          }
                          var g = a & l ^ ~a & f,
                              B = i & n ^ i & o ^ n & o,
                              w = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i << 10 | i >>> 22),
                              k = (a << 26 | a >>> 6) ^ (a << 21 | a >>> 11) ^ (a << 7 | a >>> 25),
                              S = u + k + g + c[d] + h[d],
                              m = w + B;
                          u = f, f = l, l = a, a = s + S | 0, s = o, o = n, n = i, i = S + m | 0
                      }
                      e[0] = e[0] + i | 0, e[1] = e[1] + n | 0, e[2] = e[2] + o | 0, e[3] = e[3] + s | 0, e[4] = e[4] + a | 0, e[5] = e[5] + l | 0, e[6] = e[6] + f | 0, e[7] = e[7] + u | 0
                  },
                  _doFinalize: function() {
                      var t = this._data,
                          e = t.words,
                          i = 8 * this._nDataBytes,
                          n = 8 * t.sigBytes;
                      return e[n >>> 5] |= 128 << 24 - n % 32, e[(n + 64 >>> 9 << 4) + 14] = r.floor(i / 4294967296), e[(n + 64 >>> 9 << 4) + 15] = i, t.sigBytes = 4 * e.length, this._process(), this._hash
                  },
                  clone: function() {
                      var t = o.clone.call(this);
                      return t._hash = this._hash.clone(), t
                  }
              });
          e.SHA256 = o._createHelper(l), e.HmacSHA256 = o._createHmacHelper(l)
      }(Math),
      function() {
          function r(t) {
              return t << 8 & 4278255360 | t >>> 8 & 16711935
          }
          var e = t,
              i = e.lib,
              n = i.WordArray,
              o = e.enc;
          o.Utf16 = o.Utf16BE = {
              stringify: function(t) {
                  for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n += 2) {
                      var o = r[n >>> 2] >>> 16 - n % 4 * 8 & 65535;
                      i.push(String.fromCharCode(o))
                  }
                  return i.join("")
              },
              parse: function(t) {
                  for (var r = t.length, e = [], i = 0; i < r; i++) e[i >>> 1] |= t.charCodeAt(i) << 16 - i % 2 * 16;
                  return n.create(e, 2 * r)
              }
          };
          o.Utf16LE = {
              stringify: function(t) {
                  for (var e = t.words, i = t.sigBytes, n = [], o = 0; o < i; o += 2) {
                      var s = r(e[o >>> 2] >>> 16 - o % 4 * 8 & 65535);
                      n.push(String.fromCharCode(s))
                  }
                  return n.join("")
              },
              parse: function(t) {
                  for (var e = t.length, i = [], o = 0; o < e; o++) i[o >>> 1] |= r(t.charCodeAt(o) << 16 - o % 2 * 16);
                  return n.create(i, 2 * e)
              }
          }
      }(),
      function() {
          if ("function" == typeof ArrayBuffer) {
              var r = t,
                  e = r.lib,
                  i = e.WordArray,
                  n = i.init,
                  o = i.init = function(t) {
                      if (t instanceof ArrayBuffer && (t = new Uint8Array(t)), (t instanceof Int8Array || "undefined" != typeof Uint8ClampedArray && t instanceof Uint8ClampedArray || t instanceof Int16Array || t instanceof Uint16Array || t instanceof Int32Array || t instanceof Uint32Array || t instanceof Float32Array || t instanceof Float64Array) && (t = new Uint8Array(t.buffer, t.byteOffset, t.byteLength)), t instanceof Uint8Array) {
                          for (var r = t.byteLength, e = [], i = 0; i < r; i++) e[i >>> 2] |= t[i] << 24 - i % 4 * 8;
                          n.call(this, e, r)
                      } else n.apply(this, arguments)
                  };
              o.prototype = i
          }
      }(),
      function(r) {
          function e(t, r, e) {
              return t ^ r ^ e
          }

          function i(t, r, e) {
              return t & r | ~t & e
          }

          function n(t, r, e) {
              return (t | ~r) ^ e
          }

          function o(t, r, e) {
              return t & e | r & ~e
          }

          function s(t, r, e) {
              return t ^ (r | ~e)
          }

          function a(t, r) {
              return t << r | t >>> 32 - r
          }
          var c = t,
              h = c.lib,
              l = h.WordArray,
              f = h.Hasher,
              u = c.algo,
              d = l.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]),
              v = l.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]),
              p = l.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]),
              _ = l.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]),
              y = l.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
              g = l.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),
              B = u.RIPEMD160 = f.extend({
                  _doReset: function() {
                      this._hash = l.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
                  },
                  _doProcessBlock: function(t, r) {
                      for (var c = 0; c < 16; c++) {
                          var h = r + c,
                              l = t[h];
                          t[h] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8)
                      }
                      var f, u, B, w, k, S, m, x, b, H, z = this._hash.words,
                          A = y.words,
                          C = g.words,
                          D = d.words,
                          R = v.words,
                          E = p.words,
                          M = _.words;
                      S = f = z[0], m = u = z[1], x = B = z[2], b = w = z[3], H = k = z[4];
                      for (var F, c = 0; c < 80; c += 1) F = f + t[r + D[c]] | 0, F += c < 16 ? e(u, B, w) + A[0] : c < 32 ? i(u, B, w) + A[1] : c < 48 ? n(u, B, w) + A[2] : c < 64 ? o(u, B, w) + A[3] : s(u, B, w) + A[4], F |= 0, F = a(F, E[c]), F = F + k | 0, f = k, k = w, w = a(B, 10), B = u, u = F, F = S + t[r + R[c]] | 0, F += c < 16 ? s(m, x, b) + C[0] : c < 32 ? o(m, x, b) + C[1] : c < 48 ? n(m, x, b) + C[2] : c < 64 ? i(m, x, b) + C[3] : e(m, x, b) + C[4], F |= 0, F = a(F, M[c]), F = F + H | 0, S = H, H = b, b = a(x, 10), x = m, m = F;
                      F = z[1] + B + b | 0, z[1] = z[2] + w + H | 0, z[2] = z[3] + k + S | 0, z[3] = z[4] + f + m | 0, z[4] = z[0] + u + x | 0, z[0] = F
                  },
                  _doFinalize: function() {
                      var t = this._data,
                          r = t.words,
                          e = 8 * this._nDataBytes,
                          i = 8 * t.sigBytes;
                      r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 64 >>> 9 << 4) + 14] = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8), t.sigBytes = 4 * (r.length + 1), this._process();
                      for (var n = this._hash, o = n.words, s = 0; s < 5; s++) {
                          var a = o[s];
                          o[s] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8)
                      }
                      return n
                  },
                  clone: function() {
                      var t = f.clone.call(this);
                      return t._hash = this._hash.clone(), t
                  }
              });
          c.RIPEMD160 = f._createHelper(B), c.HmacRIPEMD160 = f._createHmacHelper(B)
      }(Math),
      function() {
          var r = t,
              e = r.lib,
              i = e.Base,
              n = r.enc,
              o = n.Utf8,
              s = r.algo;
          s.HMAC = i.extend({
              init: function(t, r) {
                  t = this._hasher = new t.init, "string" == typeof r && (r = o.parse(r));
                  var e = t.blockSize,
                      i = 4 * e;
                  r.sigBytes > i && (r = t.finalize(r)), r.clamp();
                  for (var n = this._oKey = r.clone(), s = this._iKey = r.clone(), a = n.words, c = s.words, h = 0; h < e; h++) a[h] ^= 1549556828, c[h] ^= 909522486;
                  n.sigBytes = s.sigBytes = i, this.reset()
              },
              reset: function() {
                  var t = this._hasher;
                  t.reset(), t.update(this._iKey)
              },
              update: function(t) {
                  return this._hasher.update(t), this
              },
              finalize: function(t) {
                  var r = this._hasher,
                      e = r.finalize(t);
                  r.reset();
                  var i = r.finalize(this._oKey.clone().concat(e));
                  return i
              }
          })
      }(),
      function() {
          var r = t,
              e = r.lib,
              i = e.Base,
              n = e.WordArray,
              o = r.algo,
              s = o.SHA1,
              a = o.HMAC,
              c = o.PBKDF2 = i.extend({
                  cfg: i.extend({
                      keySize: 4,
                      hasher: s,
                      iterations: 1
                  }),
                  init: function(t) {
                      this.cfg = this.cfg.extend(t)
                  },
                  compute: function(t, r) {
                      for (var e = this.cfg, i = a.create(e.hasher, t), o = n.create(), s = n.create([1]), c = o.words, h = s.words, l = e.keySize, f = e.iterations; c.length < l;) {
                          var u = i.update(r).finalize(s);
                          i.reset();
                          for (var d = u.words, v = d.length, p = u, _ = 1; _ < f; _++) {
                              p = i.finalize(p), i.reset();
                              for (var y = p.words, g = 0; g < v; g++) d[g] ^= y[g]
                          }
                          o.concat(u), h[0]++
                      }
                      return o.sigBytes = 4 * l, o
                  }
              });
          r.PBKDF2 = function(t, r, e) {
              return c.create(e).compute(t, r)
          }
      }(),
      function() {
          var r = t,
              e = r.lib,
              i = e.Base,
              n = e.WordArray,
              o = r.algo,
              s = o.MD5,
              a = o.EvpKDF = i.extend({
                  cfg: i.extend({
                      keySize: 4,
                      hasher: s,
                      iterations: 1
                  }),
                  init: function(t) {
                      this.cfg = this.cfg.extend(t)
                  },
                  compute: function(t, r) {
                      for (var e = this.cfg, i = e.hasher.create(), o = n.create(), s = o.words, a = e.keySize, c = e.iterations; s.length < a;) {
                          h && i.update(h);
                          var h = i.update(t).finalize(r);
                          i.reset();
                          for (var l = 1; l < c; l++) h = i.finalize(h), i.reset();
                          o.concat(h)
                      }
                      return o.sigBytes = 4 * a, o
                  }
              });
          r.EvpKDF = function(t, r, e) {
              return a.create(e).compute(t, r)
          }
      }(),
      function() {
          var r = t,
              e = r.lib,
              i = e.WordArray,
              n = r.algo,
              o = n.SHA256,
              s = n.SHA224 = o.extend({
                  _doReset: function() {
                      this._hash = new i.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428])
                  },
                  _doFinalize: function() {
                      var t = o._doFinalize.call(this);
                      return t.sigBytes -= 4, t
                  }
              });
          r.SHA224 = o._createHelper(s), r.HmacSHA224 = o._createHmacHelper(s)
      }(),
      function(r) {
          var e = t,
              i = e.lib,
              n = i.Base,
              o = i.WordArray,
              s = e.x64 = {};
          s.Word = n.extend({
              init: function(t, r) {
                  this.high = t, this.low = r
              }
          }), s.WordArray = n.extend({
              init: function(t, e) {
                  t = this.words = t || [], e != r ? this.sigBytes = e : this.sigBytes = 8 * t.length
              },
              toX32: function() {
                  for (var t = this.words, r = t.length, e = [], i = 0; i < r; i++) {
                      var n = t[i];
                      e.push(n.high), e.push(n.low)
                  }
                  return o.create(e, this.sigBytes)
              },
              clone: function() {
                  for (var t = n.clone.call(this), r = t.words = this.words.slice(0), e = r.length, i = 0; i < e; i++) r[i] = r[i].clone();
                  return t
              }
          })
      }(),
      function(r) {
          var e = t,
              i = e.lib,
              n = i.WordArray,
              o = i.Hasher,
              s = e.x64,
              a = s.Word,
              c = e.algo,
              h = [],
              l = [],
              f = [];
          ! function() {
              for (var t = 1, r = 0, e = 0; e < 24; e++) {
                  h[t + 5 * r] = (e + 1) * (e + 2) / 2 % 64;
                  var i = r % 5,
                      n = (2 * t + 3 * r) % 5;
                  t = i, r = n
              }
              for (var t = 0; t < 5; t++)
                  for (var r = 0; r < 5; r++) l[t + 5 * r] = r + (2 * t + 3 * r) % 5 * 5;
              for (var o = 1, s = 0; s < 24; s++) {
                  for (var c = 0, u = 0, d = 0; d < 7; d++) {
                      if (1 & o) {
                          var v = (1 << d) - 1;
                          v < 32 ? u ^= 1 << v : c ^= 1 << v - 32
                      }
                      128 & o ? o = o << 1 ^ 113 : o <<= 1
                  }
                  f[s] = a.create(c, u)
              }
          }();
          var u = [];
          ! function() {
              for (var t = 0; t < 25; t++) u[t] = a.create()
          }();
          var d = c.SHA3 = o.extend({
              cfg: o.cfg.extend({
                  outputLength: 512
              }),
              _doReset: function() {
                  for (var t = this._state = [], r = 0; r < 25; r++) t[r] = new a.init;
                  this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32
              },
              _doProcessBlock: function(t, r) {
                  for (var e = this._state, i = this.blockSize / 2, n = 0; n < i; n++) {
                      var o = t[r + 2 * n],
                          s = t[r + 2 * n + 1];
                      o = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8);
                      var a = e[n];
                      a.high ^= s, a.low ^= o
                  }
                  for (var c = 0; c < 24; c++) {
                      for (var d = 0; d < 5; d++) {
                          for (var v = 0, p = 0, _ = 0; _ < 5; _++) {
                              var a = e[d + 5 * _];
                              v ^= a.high, p ^= a.low
                          }
                          var y = u[d];
                          y.high = v, y.low = p
                      }
                      for (var d = 0; d < 5; d++)
                          for (var g = u[(d + 4) % 5], B = u[(d + 1) % 5], w = B.high, k = B.low, v = g.high ^ (w << 1 | k >>> 31), p = g.low ^ (k << 1 | w >>> 31), _ = 0; _ < 5; _++) {
                              var a = e[d + 5 * _];
                              a.high ^= v, a.low ^= p
                          }
                      for (var S = 1; S < 25; S++) {
                          var a = e[S],
                              m = a.high,
                              x = a.low,
                              b = h[S];
                          if (b < 32) var v = m << b | x >>> 32 - b,
                              p = x << b | m >>> 32 - b;
                          else var v = x << b - 32 | m >>> 64 - b,
                              p = m << b - 32 | x >>> 64 - b;
                          var H = u[l[S]];
                          H.high = v, H.low = p
                      }
                      var z = u[0],
                          A = e[0];
                      z.high = A.high, z.low = A.low;
                      for (var d = 0; d < 5; d++)
                          for (var _ = 0; _ < 5; _++) {
                              var S = d + 5 * _,
                                  a = e[S],
                                  C = u[S],
                                  D = u[(d + 1) % 5 + 5 * _],
                                  R = u[(d + 2) % 5 + 5 * _];
                              a.high = C.high ^ ~D.high & R.high, a.low = C.low ^ ~D.low & R.low
                          }
                      var a = e[0],
                          E = f[c];
                      a.high ^= E.high, a.low ^= E.low
                  }
              },
              _doFinalize: function() {
                  var t = this._data,
                      e = t.words,
                      i = (8 * this._nDataBytes, 8 * t.sigBytes),
                      o = 32 * this.blockSize;
                  e[i >>> 5] |= 1 << 24 - i % 32, e[(r.ceil((i + 1) / o) * o >>> 5) - 1] |= 128, t.sigBytes = 4 * e.length, this._process();
                  for (var s = this._state, a = this.cfg.outputLength / 8, c = a / 8, h = [], l = 0; l < c; l++) {
                      var f = s[l],
                          u = f.high,
                          d = f.low;
                      u = 16711935 & (u << 8 | u >>> 24) | 4278255360 & (u << 24 | u >>> 8), d = 16711935 & (d << 8 | d >>> 24) | 4278255360 & (d << 24 | d >>> 8), h.push(d), h.push(u)
                  }
                  return new n.init(h, a)
              },
              clone: function() {
                  for (var t = o.clone.call(this), r = t._state = this._state.slice(0), e = 0; e < 25; e++) r[e] = r[e].clone();
                  return t
              }
          });
          e.SHA3 = o._createHelper(d), e.HmacSHA3 = o._createHmacHelper(d)
      }(Math),
      function() {
          function r() {
              return s.create.apply(s, arguments)
          }
          var e = t,
              i = e.lib,
              n = i.Hasher,
              o = e.x64,
              s = o.Word,
              a = o.WordArray,
              c = e.algo,
              h = [r(1116352408, 3609767458), r(1899447441, 602891725), r(3049323471, 3964484399), r(3921009573, 2173295548), r(961987163, 4081628472), r(1508970993, 3053834265), r(2453635748, 2937671579), r(2870763221, 3664609560), r(3624381080, 2734883394), r(310598401, 1164996542), r(607225278, 1323610764), r(1426881987, 3590304994), r(1925078388, 4068182383), r(2162078206, 991336113), r(2614888103, 633803317), r(3248222580, 3479774868), r(3835390401, 2666613458), r(4022224774, 944711139), r(264347078, 2341262773), r(604807628, 2007800933), r(770255983, 1495990901), r(1249150122, 1856431235), r(1555081692, 3175218132), r(1996064986, 2198950837), r(2554220882, 3999719339), r(2821834349, 766784016), r(2952996808, 2566594879), r(3210313671, 3203337956), r(3336571891, 1034457026), r(3584528711, 2466948901), r(113926993, 3758326383), r(338241895, 168717936), r(666307205, 1188179964), r(773529912, 1546045734), r(1294757372, 1522805485), r(1396182291, 2643833823), r(1695183700, 2343527390), r(1986661051, 1014477480), r(2177026350, 1206759142), r(2456956037, 344077627), r(2730485921, 1290863460), r(2820302411, 3158454273), r(3259730800, 3505952657), r(3345764771, 106217008), r(3516065817, 3606008344), r(3600352804, 1432725776), r(4094571909, 1467031594), r(275423344, 851169720), r(430227734, 3100823752), r(506948616, 1363258195), r(659060556, 3750685593), r(883997877, 3785050280), r(958139571, 3318307427), r(1322822218, 3812723403), r(1537002063, 2003034995), r(1747873779, 3602036899), r(1955562222, 1575990012), r(2024104815, 1125592928), r(2227730452, 2716904306), r(2361852424, 442776044), r(2428436474, 593698344), r(2756734187, 3733110249), r(3204031479, 2999351573), r(3329325298, 3815920427), r(3391569614, 3928383900), r(3515267271, 566280711), r(3940187606, 3454069534), r(4118630271, 4000239992), r(116418474, 1914138554), r(174292421, 2731055270), r(289380356, 3203993006), r(460393269, 320620315), r(685471733, 587496836), r(852142971, 1086792851), r(1017036298, 365543100), r(1126000580, 2618297676), r(1288033470, 3409855158), r(1501505948, 4234509866), r(1607167915, 987167468), r(1816402316, 1246189591)],
              l = [];
          ! function() {
              for (var t = 0; t < 80; t++) l[t] = r()
          }();
          var f = c.SHA512 = n.extend({
              _doReset: function() {
                  this._hash = new a.init([new s.init(1779033703, 4089235720), new s.init(3144134277, 2227873595), new s.init(1013904242, 4271175723), new s.init(2773480762, 1595750129), new s.init(1359893119, 2917565137), new s.init(2600822924, 725511199), new s.init(528734635, 4215389547), new s.init(1541459225, 327033209)])
              },
              _doProcessBlock: function(t, r) {
                  for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], s = e[3], a = e[4], c = e[5], f = e[6], u = e[7], d = i.high, v = i.low, p = n.high, _ = n.low, y = o.high, g = o.low, B = s.high, w = s.low, k = a.high, S = a.low, m = c.high, x = c.low, b = f.high, H = f.low, z = u.high, A = u.low, C = d, D = v, R = p, E = _, M = y, F = g, P = B, W = w, O = k, U = S, I = m, K = x, X = b, L = H, j = z, N = A, T = 0; T < 80; T++) {
                      var Z = l[T];
                      if (T < 16) var q = Z.high = 0 | t[r + 2 * T],
                          G = Z.low = 0 | t[r + 2 * T + 1];
                      else {
                          var J = l[T - 15],
                              $ = J.high,
                              Q = J.low,
                              V = ($ >>> 1 | Q << 31) ^ ($ >>> 8 | Q << 24) ^ $ >>> 7,
                              Y = (Q >>> 1 | $ << 31) ^ (Q >>> 8 | $ << 24) ^ (Q >>> 7 | $ << 25),
                              tt = l[T - 2],
                              rt = tt.high,
                              et = tt.low,
                              it = (rt >>> 19 | et << 13) ^ (rt << 3 | et >>> 29) ^ rt >>> 6,
                              nt = (et >>> 19 | rt << 13) ^ (et << 3 | rt >>> 29) ^ (et >>> 6 | rt << 26),
                              ot = l[T - 7],
                              st = ot.high,
                              at = ot.low,
                              ct = l[T - 16],
                              ht = ct.high,
                              lt = ct.low,
                              G = Y + at,
                              q = V + st + (G >>> 0 < Y >>> 0 ? 1 : 0),
                              G = G + nt,
                              q = q + it + (G >>> 0 < nt >>> 0 ? 1 : 0),
                              G = G + lt,
                              q = q + ht + (G >>> 0 < lt >>> 0 ? 1 : 0);
                          Z.high = q, Z.low = G
                      }
                      var ft = O & I ^ ~O & X,
                          ut = U & K ^ ~U & L,
                          dt = C & R ^ C & M ^ R & M,
                          vt = D & E ^ D & F ^ E & F,
                          pt = (C >>> 28 | D << 4) ^ (C << 30 | D >>> 2) ^ (C << 25 | D >>> 7),
                          _t = (D >>> 28 | C << 4) ^ (D << 30 | C >>> 2) ^ (D << 25 | C >>> 7),
                          yt = (O >>> 14 | U << 18) ^ (O >>> 18 | U << 14) ^ (O << 23 | U >>> 9),
                          gt = (U >>> 14 | O << 18) ^ (U >>> 18 | O << 14) ^ (U << 23 | O >>> 9),
                          Bt = h[T],
                          wt = Bt.high,
                          kt = Bt.low,
                          St = N + gt,
                          mt = j + yt + (St >>> 0 < N >>> 0 ? 1 : 0),
                          St = St + ut,
                          mt = mt + ft + (St >>> 0 < ut >>> 0 ? 1 : 0),
                          St = St + kt,
                          mt = mt + wt + (St >>> 0 < kt >>> 0 ? 1 : 0),
                          St = St + G,
                          mt = mt + q + (St >>> 0 < G >>> 0 ? 1 : 0),
                          xt = _t + vt,
                          bt = pt + dt + (xt >>> 0 < _t >>> 0 ? 1 : 0);
                      j = X, N = L, X = I, L = K, I = O, K = U, U = W + St | 0, O = P + mt + (U >>> 0 < W >>> 0 ? 1 : 0) | 0, P = M, W = F, M = R, F = E, R = C, E = D, D = St + xt | 0, C = mt + bt + (D >>> 0 < St >>> 0 ? 1 : 0) | 0
                  }
                  v = i.low = v + D, i.high = d + C + (v >>> 0 < D >>> 0 ? 1 : 0), _ = n.low = _ + E, n.high = p + R + (_ >>> 0 < E >>> 0 ? 1 : 0), g = o.low = g + F, o.high = y + M + (g >>> 0 < F >>> 0 ? 1 : 0), w = s.low = w + W, s.high = B + P + (w >>> 0 < W >>> 0 ? 1 : 0), S = a.low = S + U, a.high = k + O + (S >>> 0 < U >>> 0 ? 1 : 0), x = c.low = x + K, c.high = m + I + (x >>> 0 < K >>> 0 ? 1 : 0), H = f.low = H + L, f.high = b + X + (H >>> 0 < L >>> 0 ? 1 : 0), A = u.low = A + N, u.high = z + j + (A >>> 0 < N >>> 0 ? 1 : 0)
              },
              _doFinalize: function() {
                  var t = this._data,
                      r = t.words,
                      e = 8 * this._nDataBytes,
                      i = 8 * t.sigBytes;
                  r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 128 >>> 10 << 5) + 30] = Math.floor(e / 4294967296), r[(i + 128 >>> 10 << 5) + 31] = e, t.sigBytes = 4 * r.length, this._process();
                  var n = this._hash.toX32();
                  return n
              },
              clone: function() {
                  var t = n.clone.call(this);
                  return t._hash = this._hash.clone(), t
              },
              blockSize: 32
          });
          e.SHA512 = n._createHelper(f), e.HmacSHA512 = n._createHmacHelper(f)
      }(),
      function() {
          var r = t,
              e = r.x64,
              i = e.Word,
              n = e.WordArray,
              o = r.algo,
              s = o.SHA512,
              a = o.SHA384 = s.extend({
                  _doReset: function() {
                      this._hash = new n.init([new i.init(3418070365, 3238371032), new i.init(1654270250, 914150663), new i.init(2438529370, 812702999), new i.init(355462360, 4144912697), new i.init(1731405415, 4290775857), new i.init(2394180231, 1750603025), new i.init(3675008525, 1694076839), new i.init(1203062813, 3204075428)])
                  },
                  _doFinalize: function() {
                      var t = s._doFinalize.call(this);
                      return t.sigBytes -= 16, t
                  }
              });
          r.SHA384 = s._createHelper(a), r.HmacSHA384 = s._createHmacHelper(a)
      }(), t.lib.Cipher || function(r) {
          var e = t,
              i = e.lib,
              n = i.Base,
              o = i.WordArray,
              s = i.BufferedBlockAlgorithm,
              a = e.enc,
              c = (a.Utf8, a.Base64),
              h = e.algo,
              l = h.EvpKDF,
              f = i.Cipher = s.extend({
                  cfg: n.extend(),
                  createEncryptor: function(t, r) {
                      return this.create(this._ENC_XFORM_MODE, t, r)
                  },
                  createDecryptor: function(t, r) {
                      return this.create(this._DEC_XFORM_MODE, t, r)
                  },
                  init: function(t, r, e) {
                      this.cfg = this.cfg.extend(e), this._xformMode = t, this._key = r, this.reset()
                  },
                  reset: function() {
                      s.reset.call(this), this._doReset()
                  },
                  process: function(t) {
                      return this._append(t), this._process()
                  },
                  finalize: function(t) {
                      t && this._append(t);
                      var r = this._doFinalize();
                      return r
                  },
                  keySize: 4,
                  ivSize: 4,
                  _ENC_XFORM_MODE: 1,
                  _DEC_XFORM_MODE: 2,
                  _createHelper: function() {
                      function t(t) {
                          return "string" == typeof t ? m : w
                      }
                      return function(r) {
                          return {
                              encrypt: function(e, i, n) {
                                  return t(i).encrypt(r, e, i, n)
                              },
                              decrypt: function(e, i, n) {
                                  return t(i).decrypt(r, e, i, n)
                              }
                          }
                      }
                  }()
              }),
              u = (i.StreamCipher = f.extend({
                  _doFinalize: function() {
                      var t = this._process(!0);
                      return t
                  },
                  blockSize: 1
              }), e.mode = {}),
              d = i.BlockCipherMode = n.extend({
                  createEncryptor: function(t, r) {
                      return this.Encryptor.create(t, r)
                  },
                  createDecryptor: function(t, r) {
                      return this.Decryptor.create(t, r)
                  },
                  init: function(t, r) {
                      this._cipher = t, this._iv = r
                  }
              }),
              v = u.CBC = function() {
                  function t(t, e, i) {
                      var n = this._iv;
                      if (n) {
                          var o = n;
                          this._iv = r
                      } else var o = this._prevBlock;
                      for (var s = 0; s < i; s++) t[e + s] ^= o[s]
                  }
                  var e = d.extend();
                  return e.Encryptor = e.extend({
                      processBlock: function(r, e) {
                          var i = this._cipher,
                              n = i.blockSize;
                          t.call(this, r, e, n), i.encryptBlock(r, e), this._prevBlock = r.slice(e, e + n)
                      }
                  }), e.Decryptor = e.extend({
                      processBlock: function(r, e) {
                          var i = this._cipher,
                              n = i.blockSize,
                              o = r.slice(e, e + n);
                          i.decryptBlock(r, e), t.call(this, r, e, n), this._prevBlock = o
                      }
                  }), e
              }(),
              p = e.pad = {},
              _ = p.Pkcs7 = {
                  pad: function(t, r) {
                      for (var e = 4 * r, i = e - t.sigBytes % e, n = i << 24 | i << 16 | i << 8 | i, s = [], a = 0; a < i; a += 4) s.push(n);
                      var c = o.create(s, i);
                      t.concat(c)
                  },
                  unpad: function(t) {
                      var r = 255 & t.words[t.sigBytes - 1 >>> 2];
                      t.sigBytes -= r
                  }
              },
              y = (i.BlockCipher = f.extend({
                  cfg: f.cfg.extend({
                      mode: v,
                      padding: _
                  }),
                  reset: function() {
                      f.reset.call(this);
                      var t = this.cfg,
                          r = t.iv,
                          e = t.mode;
                      if (this._xformMode == this._ENC_XFORM_MODE) var i = e.createEncryptor;
                      else {
                          var i = e.createDecryptor;
                          this._minBufferSize = 1
                      }
                      this._mode && this._mode.__creator == i ? this._mode.init(this, r && r.words) : (this._mode = i.call(e, this, r && r.words), this._mode.__creator = i)
                  },
                  _doProcessBlock: function(t, r) {
                      this._mode.processBlock(t, r)
                  },
                  _doFinalize: function() {
                      var t = this.cfg.padding;
                      if (this._xformMode == this._ENC_XFORM_MODE) {
                          t.pad(this._data, this.blockSize);
                          var r = this._process(!0)
                      } else {
                          var r = this._process(!0);
                          t.unpad(r)
                      }
                      return r
                  },
                  blockSize: 4
              }), i.CipherParams = n.extend({
                  init: function(t) {
                      this.mixIn(t)
                  },
                  toString: function(t) {
                      return (t || this.formatter).stringify(this)
                  }
              })),
              g = e.format = {},
              B = g.OpenSSL = {
                  stringify: function(t) {
                      var r = t.ciphertext,
                          e = t.salt;
                      if (e) var i = o.create([1398893684, 1701076831]).concat(e).concat(r);
                      else var i = r;
                      return i.toString(c)
                  },
                  parse: function(t) {
                      var r = c.parse(t),
                          e = r.words;
                      if (1398893684 == e[0] && 1701076831 == e[1]) {
                          var i = o.create(e.slice(2, 4));
                          e.splice(0, 4), r.sigBytes -= 16
                      }
                      return y.create({
                          ciphertext: r,
                          salt: i
                      })
                  }
              },
              w = i.SerializableCipher = n.extend({
                  cfg: n.extend({
                      format: B
                  }),
                  encrypt: function(t, r, e, i) {
                      i = this.cfg.extend(i);
                      var n = t.createEncryptor(e, i),
                          o = n.finalize(r),
                          s = n.cfg;
                      return y.create({
                          ciphertext: o,
                          key: e,
                          iv: s.iv,
                          algorithm: t,
                          mode: s.mode,
                          padding: s.padding,
                          blockSize: t.blockSize,
                          formatter: i.format
                      })
                  },
                  decrypt: function(t, r, e, i) {
                      i = this.cfg.extend(i), r = this._parse(r, i.format);
                      var n = t.createDecryptor(e, i).finalize(r.ciphertext);
                      return n
                  },
                  _parse: function(t, r) {
                      return "string" == typeof t ? r.parse(t, this) : t
                  }
              }),
              k = e.kdf = {},
              S = k.OpenSSL = {
                  execute: function(t, r, e, i) {
                      i || (i = o.random(8));
                      var n = l.create({
                              keySize: r + e
                          }).compute(t, i),
                          s = o.create(n.words.slice(r), 4 * e);
                      return n.sigBytes = 4 * r, y.create({
                          key: n,
                          iv: s,
                          salt: i
                      })
                  }
              },
              m = i.PasswordBasedCipher = w.extend({
                  cfg: w.cfg.extend({
                      kdf: S
                  }),
                  encrypt: function(t, r, e, i) {
                      i = this.cfg.extend(i);
                      var n = i.kdf.execute(e, t.keySize, t.ivSize);
                      i.iv = n.iv;
                      var o = w.encrypt.call(this, t, r, n.key, i);
                      return o.mixIn(n), o
                  },
                  decrypt: function(t, r, e, i) {
                      i = this.cfg.extend(i), r = this._parse(r, i.format);
                      var n = i.kdf.execute(e, t.keySize, t.ivSize, r.salt);
                      i.iv = n.iv;
                      var o = w.decrypt.call(this, t, r, n.key, i);
                      return o
                  }
              })
      }(), t.mode.CFB = function() {
          function r(t, r, e, i) {
              var n = this._iv;
              if (n) {
                  var o = n.slice(0);
                  this._iv = void 0
              } else var o = this._prevBlock;
              i.encryptBlock(o, 0);
              for (var s = 0; s < e; s++) t[r + s] ^= o[s]
          }
          var e = t.lib.BlockCipherMode.extend();
          return e.Encryptor = e.extend({
              processBlock: function(t, e) {
                  var i = this._cipher,
                      n = i.blockSize;
                  r.call(this, t, e, n, i), this._prevBlock = t.slice(e, e + n)
              }
          }), e.Decryptor = e.extend({
              processBlock: function(t, e) {
                  var i = this._cipher,
                      n = i.blockSize,
                      o = t.slice(e, e + n);
                  r.call(this, t, e, n, i), this._prevBlock = o
              }
          }), e
      }(), t.mode.ECB = function() {
          var r = t.lib.BlockCipherMode.extend();
          return r.Encryptor = r.extend({
              processBlock: function(t, r) {
                  this._cipher.encryptBlock(t, r)
              }
          }), r.Decryptor = r.extend({
              processBlock: function(t, r) {
                  this._cipher.decryptBlock(t, r)
              }
          }), r
      }(), t.pad.AnsiX923 = {
          pad: function(t, r) {
              var e = t.sigBytes,
                  i = 4 * r,
                  n = i - e % i,
                  o = e + n - 1;
              t.clamp(), t.words[o >>> 2] |= n << 24 - o % 4 * 8, t.sigBytes += n
          },
          unpad: function(t) {
              var r = 255 & t.words[t.sigBytes - 1 >>> 2];
              t.sigBytes -= r
          }
      }, t.pad.Iso10126 = {
          pad: function(r, e) {
              var i = 4 * e,
                  n = i - r.sigBytes % i;
              r.concat(t.lib.WordArray.random(n - 1)).concat(t.lib.WordArray.create([n << 24], 1))
          },
          unpad: function(t) {
              var r = 255 & t.words[t.sigBytes - 1 >>> 2];
              t.sigBytes -= r
          }
      }, t.pad.Iso97971 = {
          pad: function(r, e) {
              r.concat(t.lib.WordArray.create([2147483648], 1)), t.pad.ZeroPadding.pad(r, e)
          },
          unpad: function(r) {
              t.pad.ZeroPadding.unpad(r), r.sigBytes--
          }
      }, t.mode.OFB = function() {
          var r = t.lib.BlockCipherMode.extend(),
              e = r.Encryptor = r.extend({
                  processBlock: function(t, r) {
                      var e = this._cipher,
                          i = e.blockSize,
                          n = this._iv,
                          o = this._keystream;
                      n && (o = this._keystream = n.slice(0), this._iv = void 0), e.encryptBlock(o, 0);
                      for (var s = 0; s < i; s++) t[r + s] ^= o[s]
                  }
              });
          return r.Decryptor = e, r
      }(), t.pad.NoPadding = {
          pad: function() {},
          unpad: function() {}
      },
      function(r) {
          var e = t,
              i = e.lib,
              n = i.CipherParams,
              o = e.enc,
              s = o.Hex,
              a = e.format;
          a.Hex = {
              stringify: function(t) {
                  return t.ciphertext.toString(s)
              },
              parse: function(t) {
                  var r = s.parse(t);
                  return n.create({
                      ciphertext: r
                  })
              }
          }
      }(),
      function() {
          var r = t,
              e = r.lib,
              i = e.BlockCipher,
              n = r.algo,
              o = [],
              s = [],
              a = [],
              c = [],
              h = [],
              l = [],
              f = [],
              u = [],
              d = [],
              v = [];
          ! function() {
              for (var t = [], r = 0; r < 256; r++) r < 128 ? t[r] = r << 1 : t[r] = r << 1 ^ 283;
              for (var e = 0, i = 0, r = 0; r < 256; r++) {
                  var n = i ^ i << 1 ^ i << 2 ^ i << 3 ^ i << 4;
                  n = n >>> 8 ^ 255 & n ^ 99, o[e] = n, s[n] = e;
                  var p = t[e],
                      _ = t[p],
                      y = t[_],
                      g = 257 * t[n] ^ 16843008 * n;
                  a[e] = g << 24 | g >>> 8, c[e] = g << 16 | g >>> 16, h[e] = g << 8 | g >>> 24, l[e] = g;
                  var g = 16843009 * y ^ 65537 * _ ^ 257 * p ^ 16843008 * e;
                  f[n] = g << 24 | g >>> 8, u[n] = g << 16 | g >>> 16, d[n] = g << 8 | g >>> 24, v[n] = g, e ? (e = p ^ t[t[t[y ^ p]]], i ^= t[t[i]]) : e = i = 1
              }
          }();
          var p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
              _ = n.AES = i.extend({
                  _doReset: function() {
                      if (!this._nRounds || this._keyPriorReset !== this._key) {
                          for (var t = this._keyPriorReset = this._key, r = t.words, e = t.sigBytes / 4, i = this._nRounds = e + 6, n = 4 * (i + 1), s = this._keySchedule = [], a = 0; a < n; a++)
                              if (a < e) s[a] = r[a];
                              else {
                                  var c = s[a - 1];
                                  a % e ? e > 6 && a % e == 4 && (c = o[c >>> 24] << 24 | o[c >>> 16 & 255] << 16 | o[c >>> 8 & 255] << 8 | o[255 & c]) : (c = c << 8 | c >>> 24, c = o[c >>> 24] << 24 | o[c >>> 16 & 255] << 16 | o[c >>> 8 & 255] << 8 | o[255 & c], c ^= p[a / e | 0] << 24), s[a] = s[a - e] ^ c
                              }
                          for (var h = this._invKeySchedule = [], l = 0; l < n; l++) {
                              var a = n - l;
                              if (l % 4) var c = s[a];
                              else var c = s[a - 4];
                              l < 4 || a <= 4 ? h[l] = c : h[l] = f[o[c >>> 24]] ^ u[o[c >>> 16 & 255]] ^ d[o[c >>> 8 & 255]] ^ v[o[255 & c]]
                          }
                      }
                  },
                  encryptBlock: function(t, r) {
                      this._doCryptBlock(t, r, this._keySchedule, a, c, h, l, o)
                  },
                  decryptBlock: function(t, r) {
                      var e = t[r + 1];
                      t[r + 1] = t[r + 3], t[r + 3] = e, this._doCryptBlock(t, r, this._invKeySchedule, f, u, d, v, s);
                      var e = t[r + 1];
                      t[r + 1] = t[r + 3], t[r + 3] = e
                  },
                  _doCryptBlock: function(t, r, e, i, n, o, s, a) {
                      for (var c = this._nRounds, h = t[r] ^ e[0], l = t[r + 1] ^ e[1], f = t[r + 2] ^ e[2], u = t[r + 3] ^ e[3], d = 4, v = 1; v < c; v++) {
                          var p = i[h >>> 24] ^ n[l >>> 16 & 255] ^ o[f >>> 8 & 255] ^ s[255 & u] ^ e[d++],
                              _ = i[l >>> 24] ^ n[f >>> 16 & 255] ^ o[u >>> 8 & 255] ^ s[255 & h] ^ e[d++],
                              y = i[f >>> 24] ^ n[u >>> 16 & 255] ^ o[h >>> 8 & 255] ^ s[255 & l] ^ e[d++],
                              g = i[u >>> 24] ^ n[h >>> 16 & 255] ^ o[l >>> 8 & 255] ^ s[255 & f] ^ e[d++];
                          h = p, l = _, f = y, u = g
                      }
                      var p = (a[h >>> 24] << 24 | a[l >>> 16 & 255] << 16 | a[f >>> 8 & 255] << 8 | a[255 & u]) ^ e[d++],
                          _ = (a[l >>> 24] << 24 | a[f >>> 16 & 255] << 16 | a[u >>> 8 & 255] << 8 | a[255 & h]) ^ e[d++],
                          y = (a[f >>> 24] << 24 | a[u >>> 16 & 255] << 16 | a[h >>> 8 & 255] << 8 | a[255 & l]) ^ e[d++],
                          g = (a[u >>> 24] << 24 | a[h >>> 16 & 255] << 16 | a[l >>> 8 & 255] << 8 | a[255 & f]) ^ e[d++];
                      t[r] = p, t[r + 1] = _, t[r + 2] = y, t[r + 3] = g
                  },
                  keySize: 8
              });
          r.AES = i._createHelper(_)
      }(),
      function() {
          function r(t, r) {
              var e = (this._lBlock >>> t ^ this._rBlock) & r;
              this._rBlock ^= e, this._lBlock ^= e << t
          }

          function e(t, r) {
              var e = (this._rBlock >>> t ^ this._lBlock) & r;
              this._lBlock ^= e, this._rBlock ^= e << t;
          }
          var i = t,
              n = i.lib,
              o = n.WordArray,
              s = n.BlockCipher,
              a = i.algo,
              c = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4],
              h = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32],
              l = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
              f = [{
                  0: 8421888,
                  268435456: 32768,
                  536870912: 8421378,
                  805306368: 2,
                  1073741824: 512,
                  1342177280: 8421890,
                  1610612736: 8389122,
                  1879048192: 8388608,
                  2147483648: 514,
                  2415919104: 8389120,
                  2684354560: 33280,
                  2952790016: 8421376,
                  3221225472: 32770,
                  3489660928: 8388610,
                  3758096384: 0,
                  4026531840: 33282,
                  134217728: 0,
                  402653184: 8421890,
                  671088640: 33282,
                  939524096: 32768,
                  1207959552: 8421888,
                  1476395008: 512,
                  1744830464: 8421378,
                  2013265920: 2,
                  2281701376: 8389120,
                  2550136832: 33280,
                  2818572288: 8421376,
                  3087007744: 8389122,
                  3355443200: 8388610,
                  3623878656: 32770,
                  3892314112: 514,
                  4160749568: 8388608,
                  1: 32768,
                  268435457: 2,
                  536870913: 8421888,
                  805306369: 8388608,
                  1073741825: 8421378,
                  1342177281: 33280,
                  1610612737: 512,
                  1879048193: 8389122,
                  2147483649: 8421890,
                  2415919105: 8421376,
                  2684354561: 8388610,
                  2952790017: 33282,
                  3221225473: 514,
                  3489660929: 8389120,
                  3758096385: 32770,
                  4026531841: 0,
                  134217729: 8421890,
                  402653185: 8421376,
                  671088641: 8388608,
                  939524097: 512,
                  1207959553: 32768,
                  1476395009: 8388610,
                  1744830465: 2,
                  2013265921: 33282,
                  2281701377: 32770,
                  2550136833: 8389122,
                  2818572289: 514,
                  3087007745: 8421888,
                  3355443201: 8389120,
                  3623878657: 0,
                  3892314113: 33280,
                  4160749569: 8421378
              }, {
                  0: 1074282512,
                  16777216: 16384,
                  33554432: 524288,
                  50331648: 1074266128,
                  67108864: 1073741840,
                  83886080: 1074282496,
                  100663296: 1073758208,
                  117440512: 16,
                  134217728: 540672,
                  150994944: 1073758224,
                  167772160: 1073741824,
                  184549376: 540688,
                  201326592: 524304,
                  218103808: 0,
                  234881024: 16400,
                  251658240: 1074266112,
                  8388608: 1073758208,
                  25165824: 540688,
                  41943040: 16,
                  58720256: 1073758224,
                  75497472: 1074282512,
                  92274688: 1073741824,
                  109051904: 524288,
                  125829120: 1074266128,
                  142606336: 524304,
                  159383552: 0,
                  176160768: 16384,
                  192937984: 1074266112,
                  209715200: 1073741840,
                  226492416: 540672,
                  243269632: 1074282496,
                  260046848: 16400,
                  268435456: 0,
                  285212672: 1074266128,
                  301989888: 1073758224,
                  318767104: 1074282496,
                  335544320: 1074266112,
                  352321536: 16,
                  369098752: 540688,
                  385875968: 16384,
                  402653184: 16400,
                  419430400: 524288,
                  436207616: 524304,
                  452984832: 1073741840,
                  469762048: 540672,
                  486539264: 1073758208,
                  503316480: 1073741824,
                  520093696: 1074282512,
                  276824064: 540688,
                  293601280: 524288,
                  310378496: 1074266112,
                  327155712: 16384,
                  343932928: 1073758208,
                  360710144: 1074282512,
                  377487360: 16,
                  394264576: 1073741824,
                  411041792: 1074282496,
                  427819008: 1073741840,
                  444596224: 1073758224,
                  461373440: 524304,
                  478150656: 0,
                  494927872: 16400,
                  511705088: 1074266128,
                  528482304: 540672
              }, {
                  0: 260,
                  1048576: 0,
                  2097152: 67109120,
                  3145728: 65796,
                  4194304: 65540,
                  5242880: 67108868,
                  6291456: 67174660,
                  7340032: 67174400,
                  8388608: 67108864,
                  9437184: 67174656,
                  10485760: 65792,
                  11534336: 67174404,
                  12582912: 67109124,
                  13631488: 65536,
                  14680064: 4,
                  15728640: 256,
                  524288: 67174656,
                  1572864: 67174404,
                  2621440: 0,
                  3670016: 67109120,
                  4718592: 67108868,
                  5767168: 65536,
                  6815744: 65540,
                  7864320: 260,
                  8912896: 4,
                  9961472: 256,
                  11010048: 67174400,
                  12058624: 65796,
                  13107200: 65792,
                  14155776: 67109124,
                  15204352: 67174660,
                  16252928: 67108864,
                  16777216: 67174656,
                  17825792: 65540,
                  18874368: 65536,
                  19922944: 67109120,
                  20971520: 256,
                  22020096: 67174660,
                  23068672: 67108868,
                  24117248: 0,
                  25165824: 67109124,
                  26214400: 67108864,
                  27262976: 4,
                  28311552: 65792,
                  29360128: 67174400,
                  30408704: 260,
                  31457280: 65796,
                  32505856: 67174404,
                  17301504: 67108864,
                  18350080: 260,
                  19398656: 67174656,
                  20447232: 0,
                  21495808: 65540,
                  22544384: 67109120,
                  23592960: 256,
                  24641536: 67174404,
                  25690112: 65536,
                  26738688: 67174660,
                  27787264: 65796,
                  28835840: 67108868,
                  29884416: 67109124,
                  30932992: 67174400,
                  31981568: 4,
                  33030144: 65792
              }, {
                  0: 2151682048,
                  65536: 2147487808,
                  131072: 4198464,
                  196608: 2151677952,
                  262144: 0,
                  327680: 4198400,
                  393216: 2147483712,
                  458752: 4194368,
                  524288: 2147483648,
                  589824: 4194304,
                  655360: 64,
                  720896: 2147487744,
                  786432: 2151678016,
                  851968: 4160,
                  917504: 4096,
                  983040: 2151682112,
                  32768: 2147487808,
                  98304: 64,
                  163840: 2151678016,
                  229376: 2147487744,
                  294912: 4198400,
                  360448: 2151682112,
                  425984: 0,
                  491520: 2151677952,
                  557056: 4096,
                  622592: 2151682048,
                  688128: 4194304,
                  753664: 4160,
                  819200: 2147483648,
                  884736: 4194368,
                  950272: 4198464,
                  1015808: 2147483712,
                  1048576: 4194368,
                  1114112: 4198400,
                  1179648: 2147483712,
                  1245184: 0,
                  1310720: 4160,
                  1376256: 2151678016,
                  1441792: 2151682048,
                  1507328: 2147487808,
                  1572864: 2151682112,
                  1638400: 2147483648,
                  1703936: 2151677952,
                  1769472: 4198464,
                  1835008: 2147487744,
                  1900544: 4194304,
                  1966080: 64,
                  2031616: 4096,
                  1081344: 2151677952,
                  1146880: 2151682112,
                  1212416: 0,
                  1277952: 4198400,
                  1343488: 4194368,
                  1409024: 2147483648,
                  1474560: 2147487808,
                  1540096: 64,
                  1605632: 2147483712,
                  1671168: 4096,
                  1736704: 2147487744,
                  1802240: 2151678016,
                  1867776: 4160,
                  1933312: 2151682048,
                  1998848: 4194304,
                  2064384: 4198464
              }, {
                  0: 128,
                  4096: 17039360,
                  8192: 262144,
                  12288: 536870912,
                  16384: 537133184,
                  20480: 16777344,
                  24576: 553648256,
                  28672: 262272,
                  32768: 16777216,
                  36864: 537133056,
                  40960: 536871040,
                  45056: 553910400,
                  49152: 553910272,
                  53248: 0,
                  57344: 17039488,
                  61440: 553648128,
                  2048: 17039488,
                  6144: 553648256,
                  10240: 128,
                  14336: 17039360,
                  18432: 262144,
                  22528: 537133184,
                  26624: 553910272,
                  30720: 536870912,
                  34816: 537133056,
                  38912: 0,
                  43008: 553910400,
                  47104: 16777344,
                  51200: 536871040,
                  55296: 553648128,
                  59392: 16777216,
                  63488: 262272,
                  65536: 262144,
                  69632: 128,
                  73728: 536870912,
                  77824: 553648256,
                  81920: 16777344,
                  86016: 553910272,
                  90112: 537133184,
                  94208: 16777216,
                  98304: 553910400,
                  102400: 553648128,
                  106496: 17039360,
                  110592: 537133056,
                  114688: 262272,
                  118784: 536871040,
                  122880: 0,
                  126976: 17039488,
                  67584: 553648256,
                  71680: 16777216,
                  75776: 17039360,
                  79872: 537133184,
                  83968: 536870912,
                  88064: 17039488,
                  92160: 128,
                  96256: 553910272,
                  100352: 262272,
                  104448: 553910400,
                  108544: 0,
                  112640: 553648128,
                  116736: 16777344,
                  120832: 262144,
                  124928: 537133056,
                  129024: 536871040
              }, {
                  0: 268435464,
                  256: 8192,
                  512: 270532608,
                  768: 270540808,
                  1024: 268443648,
                  1280: 2097152,
                  1536: 2097160,
                  1792: 268435456,
                  2048: 0,
                  2304: 268443656,
                  2560: 2105344,
                  2816: 8,
                  3072: 270532616,
                  3328: 2105352,
                  3584: 8200,
                  3840: 270540800,
                  128: 270532608,
                  384: 270540808,
                  640: 8,
                  896: 2097152,
                  1152: 2105352,
                  1408: 268435464,
                  1664: 268443648,
                  1920: 8200,
                  2176: 2097160,
                  2432: 8192,
                  2688: 268443656,
                  2944: 270532616,
                  3200: 0,
                  3456: 270540800,
                  3712: 2105344,
                  3968: 268435456,
                  4096: 268443648,
                  4352: 270532616,
                  4608: 270540808,
                  4864: 8200,
                  5120: 2097152,
                  5376: 268435456,
                  5632: 268435464,
                  5888: 2105344,
                  6144: 2105352,
                  6400: 0,
                  6656: 8,
                  6912: 270532608,
                  7168: 8192,
                  7424: 268443656,
                  7680: 270540800,
                  7936: 2097160,
                  4224: 8,
                  4480: 2105344,
                  4736: 2097152,
                  4992: 268435464,
                  5248: 268443648,
                  5504: 8200,
                  5760: 270540808,
                  6016: 270532608,
                  6272: 270540800,
                  6528: 270532616,
                  6784: 8192,
                  7040: 2105352,
                  7296: 2097160,
                  7552: 0,
                  7808: 268435456,
                  8064: 268443656
              }, {
                  0: 1048576,
                  16: 33555457,
                  32: 1024,
                  48: 1049601,
                  64: 34604033,
                  80: 0,
                  96: 1,
                  112: 34603009,
                  128: 33555456,
                  144: 1048577,
                  160: 33554433,
                  176: 34604032,
                  192: 34603008,
                  208: 1025,
                  224: 1049600,
                  240: 33554432,
                  8: 34603009,
                  24: 0,
                  40: 33555457,
                  56: 34604032,
                  72: 1048576,
                  88: 33554433,
                  104: 33554432,
                  120: 1025,
                  136: 1049601,
                  152: 33555456,
                  168: 34603008,
                  184: 1048577,
                  200: 1024,
                  216: 34604033,
                  232: 1,
                  248: 1049600,
                  256: 33554432,
                  272: 1048576,
                  288: 33555457,
                  304: 34603009,
                  320: 1048577,
                  336: 33555456,
                  352: 34604032,
                  368: 1049601,
                  384: 1025,
                  400: 34604033,
                  416: 1049600,
                  432: 1,
                  448: 0,
                  464: 34603008,
                  480: 33554433,
                  496: 1024,
                  264: 1049600,
                  280: 33555457,
                  296: 34603009,
                  312: 1,
                  328: 33554432,
                  344: 1048576,
                  360: 1025,
                  376: 34604032,
                  392: 33554433,
                  408: 34603008,
                  424: 0,
                  440: 34604033,
                  456: 1049601,
                  472: 1024,
                  488: 33555456,
                  504: 1048577
              }, {
                  0: 134219808,
                  1: 131072,
                  2: 134217728,
                  3: 32,
                  4: 131104,
                  5: 134350880,
                  6: 134350848,
                  7: 2048,
                  8: 134348800,
                  9: 134219776,
                  10: 133120,
                  11: 134348832,
                  12: 2080,
                  13: 0,
                  14: 134217760,
                  15: 133152,
                  2147483648: 2048,
                  2147483649: 134350880,
                  2147483650: 134219808,
                  2147483651: 134217728,
                  2147483652: 134348800,
                  2147483653: 133120,
                  2147483654: 133152,
                  2147483655: 32,
                  2147483656: 134217760,
                  2147483657: 2080,
                  2147483658: 131104,
                  2147483659: 134350848,
                  2147483660: 0,
                  2147483661: 134348832,
                  2147483662: 134219776,
                  2147483663: 131072,
                  16: 133152,
                  17: 134350848,
                  18: 32,
                  19: 2048,
                  20: 134219776,
                  21: 134217760,
                  22: 134348832,
                  23: 131072,
                  24: 0,
                  25: 131104,
                  26: 134348800,
                  27: 134219808,
                  28: 134350880,
                  29: 133120,
                  30: 2080,
                  31: 134217728,
                  2147483664: 131072,
                  2147483665: 2048,
                  2147483666: 134348832,
                  2147483667: 133152,
                  2147483668: 32,
                  2147483669: 134348800,
                  2147483670: 134217728,
                  2147483671: 134219808,
                  2147483672: 134350880,
                  2147483673: 134217760,
                  2147483674: 134219776,
                  2147483675: 0,
                  2147483676: 133120,
                  2147483677: 2080,
                  2147483678: 131104,
                  2147483679: 134350848
              }],
              u = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
              d = a.DES = s.extend({
                  _doReset: function() {
                      for (var t = this._key, r = t.words, e = [], i = 0; i < 56; i++) {
                          var n = c[i] - 1;
                          e[i] = r[n >>> 5] >>> 31 - n % 32 & 1
                      }
                      for (var o = this._subKeys = [], s = 0; s < 16; s++) {
                          for (var a = o[s] = [], f = l[s], i = 0; i < 24; i++) a[i / 6 | 0] |= e[(h[i] - 1 + f) % 28] << 31 - i % 6, a[4 + (i / 6 | 0)] |= e[28 + (h[i + 24] - 1 + f) % 28] << 31 - i % 6;
                          a[0] = a[0] << 1 | a[0] >>> 31;
                          for (var i = 1; i < 7; i++) a[i] = a[i] >>> 4 * (i - 1) + 3;
                          a[7] = a[7] << 5 | a[7] >>> 27
                      }
                      for (var u = this._invSubKeys = [], i = 0; i < 16; i++) u[i] = o[15 - i]
                  },
                  encryptBlock: function(t, r) {
                      this._doCryptBlock(t, r, this._subKeys)
                  },
                  decryptBlock: function(t, r) {
                      this._doCryptBlock(t, r, this._invSubKeys)
                  },
                  _doCryptBlock: function(t, i, n) {
                      this._lBlock = t[i], this._rBlock = t[i + 1], r.call(this, 4, 252645135), r.call(this, 16, 65535), e.call(this, 2, 858993459), e.call(this, 8, 16711935), r.call(this, 1, 1431655765);
                      for (var o = 0; o < 16; o++) {
                          for (var s = n[o], a = this._lBlock, c = this._rBlock, h = 0, l = 0; l < 8; l++) h |= f[l][((c ^ s[l]) & u[l]) >>> 0];
                          this._lBlock = c, this._rBlock = a ^ h
                      }
                      var d = this._lBlock;
                      this._lBlock = this._rBlock, this._rBlock = d, r.call(this, 1, 1431655765), e.call(this, 8, 16711935), e.call(this, 2, 858993459), r.call(this, 16, 65535), r.call(this, 4, 252645135), t[i] = this._lBlock, t[i + 1] = this._rBlock
                  },
                  keySize: 2,
                  ivSize: 2,
                  blockSize: 2
              });
          i.DES = s._createHelper(d);
          var v = a.TripleDES = s.extend({
              _doReset: function() {
                  var t = this._key,
                      r = t.words;
                  this._des1 = d.createEncryptor(o.create(r.slice(0, 2))), this._des2 = d.createEncryptor(o.create(r.slice(2, 4))), this._des3 = d.createEncryptor(o.create(r.slice(4, 6)))
              },
              encryptBlock: function(t, r) {
                  this._des1.encryptBlock(t, r), this._des2.decryptBlock(t, r), this._des3.encryptBlock(t, r)
              },
              decryptBlock: function(t, r) {
                  this._des3.decryptBlock(t, r), this._des2.encryptBlock(t, r), this._des1.decryptBlock(t, r)
              },
              keySize: 6,
              ivSize: 2,
              blockSize: 2
          });
          i.TripleDES = s._createHelper(v)
      }(),
      function() {
          function r() {
              for (var t = this._S, r = this._i, e = this._j, i = 0, n = 0; n < 4; n++) {
                  r = (r + 1) % 256, e = (e + t[r]) % 256;
                  var o = t[r];
                  t[r] = t[e], t[e] = o, i |= t[(t[r] + t[e]) % 256] << 24 - 8 * n
              }
              return this._i = r, this._j = e, i
          }
          var e = t,
              i = e.lib,
              n = i.StreamCipher,
              o = e.algo,
              s = o.RC4 = n.extend({
                  _doReset: function() {
                      for (var t = this._key, r = t.words, e = t.sigBytes, i = this._S = [], n = 0; n < 256; n++) i[n] = n;
                      for (var n = 0, o = 0; n < 256; n++) {
                          var s = n % e,
                              a = r[s >>> 2] >>> 24 - s % 4 * 8 & 255;
                          o = (o + i[n] + a) % 256;
                          var c = i[n];
                          i[n] = i[o], i[o] = c
                      }
                      this._i = this._j = 0
                  },
                  _doProcessBlock: function(t, e) {
                      t[e] ^= r.call(this)
                  },
                  keySize: 8,
                  ivSize: 0
              });
          e.RC4 = n._createHelper(s);
          var a = o.RC4Drop = s.extend({
              cfg: s.cfg.extend({
                  drop: 192
              }),
              _doReset: function() {
                  s._doReset.call(this);
                  for (var t = this.cfg.drop; t > 0; t--) r.call(this)
              }
          });
          e.RC4Drop = n._createHelper(a)
      }(), t.mode.CTRGladman = function() {
          function r(t) {
              if (255 === (t >> 24 & 255)) {
                  var r = t >> 16 & 255,
                      e = t >> 8 & 255,
                      i = 255 & t;
                  255 === r ? (r = 0, 255 === e ? (e = 0, 255 === i ? i = 0 : ++i) : ++e) : ++r, t = 0, t += r << 16, t += e << 8, t += i
              } else t += 1 << 24;
              return t
          }

          function e(t) {
              return 0 === (t[0] = r(t[0])) && (t[1] = r(t[1])), t
          }
          var i = t.lib.BlockCipherMode.extend(),
              n = i.Encryptor = i.extend({
                  processBlock: function(t, r) {
                      var i = this._cipher,
                          n = i.blockSize,
                          o = this._iv,
                          s = this._counter;
                      o && (s = this._counter = o.slice(0), this._iv = void 0), e(s);
                      var a = s.slice(0);
                      i.encryptBlock(a, 0);
                      for (var c = 0; c < n; c++) t[r + c] ^= a[c]
                  }
              });
          return i.Decryptor = n, i
      }(),
      function() {
          function r() {
              for (var t = this._X, r = this._C, e = 0; e < 8; e++) a[e] = r[e];
              r[0] = r[0] + 1295307597 + this._b | 0, r[1] = r[1] + 3545052371 + (r[0] >>> 0 < a[0] >>> 0 ? 1 : 0) | 0, r[2] = r[2] + 886263092 + (r[1] >>> 0 < a[1] >>> 0 ? 1 : 0) | 0, r[3] = r[3] + 1295307597 + (r[2] >>> 0 < a[2] >>> 0 ? 1 : 0) | 0, r[4] = r[4] + 3545052371 + (r[3] >>> 0 < a[3] >>> 0 ? 1 : 0) | 0, r[5] = r[5] + 886263092 + (r[4] >>> 0 < a[4] >>> 0 ? 1 : 0) | 0, r[6] = r[6] + 1295307597 + (r[5] >>> 0 < a[5] >>> 0 ? 1 : 0) | 0, r[7] = r[7] + 3545052371 + (r[6] >>> 0 < a[6] >>> 0 ? 1 : 0) | 0, this._b = r[7] >>> 0 < a[7] >>> 0 ? 1 : 0;
              for (var e = 0; e < 8; e++) {
                  var i = t[e] + r[e],
                      n = 65535 & i,
                      o = i >>> 16,
                      s = ((n * n >>> 17) + n * o >>> 15) + o * o,
                      h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0);
                  c[e] = s ^ h
              }
              t[0] = c[0] + (c[7] << 16 | c[7] >>> 16) + (c[6] << 16 | c[6] >>> 16) | 0, t[1] = c[1] + (c[0] << 8 | c[0] >>> 24) + c[7] | 0, t[2] = c[2] + (c[1] << 16 | c[1] >>> 16) + (c[0] << 16 | c[0] >>> 16) | 0, t[3] = c[3] + (c[2] << 8 | c[2] >>> 24) + c[1] | 0, t[4] = c[4] + (c[3] << 16 | c[3] >>> 16) + (c[2] << 16 | c[2] >>> 16) | 0, t[5] = c[5] + (c[4] << 8 | c[4] >>> 24) + c[3] | 0, t[6] = c[6] + (c[5] << 16 | c[5] >>> 16) + (c[4] << 16 | c[4] >>> 16) | 0, t[7] = c[7] + (c[6] << 8 | c[6] >>> 24) + c[5] | 0
          }
          var e = t,
              i = e.lib,
              n = i.StreamCipher,
              o = e.algo,
              s = [],
              a = [],
              c = [],
              h = o.Rabbit = n.extend({
                  _doReset: function() {
                      for (var t = this._key.words, e = this.cfg.iv, i = 0; i < 4; i++) t[i] = 16711935 & (t[i] << 8 | t[i] >>> 24) | 4278255360 & (t[i] << 24 | t[i] >>> 8);
                      var n = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16],
                          o = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]];
                      this._b = 0;
                      for (var i = 0; i < 4; i++) r.call(this);
                      for (var i = 0; i < 8; i++) o[i] ^= n[i + 4 & 7];
                      if (e) {
                          var s = e.words,
                              a = s[0],
                              c = s[1],
                              h = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8),
                              l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8),
                              f = h >>> 16 | 4294901760 & l,
                              u = l << 16 | 65535 & h;
                          o[0] ^= h, o[1] ^= f, o[2] ^= l, o[3] ^= u, o[4] ^= h, o[5] ^= f, o[6] ^= l, o[7] ^= u;
                          for (var i = 0; i < 4; i++) r.call(this)
                      }
                  },
                  _doProcessBlock: function(t, e) {
                      var i = this._X;
                      r.call(this), s[0] = i[0] ^ i[5] >>> 16 ^ i[3] << 16, s[1] = i[2] ^ i[7] >>> 16 ^ i[5] << 16, s[2] = i[4] ^ i[1] >>> 16 ^ i[7] << 16, s[3] = i[6] ^ i[3] >>> 16 ^ i[1] << 16;
                      for (var n = 0; n < 4; n++) s[n] = 16711935 & (s[n] << 8 | s[n] >>> 24) | 4278255360 & (s[n] << 24 | s[n] >>> 8), t[e + n] ^= s[n]
                  },
                  blockSize: 4,
                  ivSize: 2
              });
          e.Rabbit = n._createHelper(h)
      }(), t.mode.CTR = function() {
          var r = t.lib.BlockCipherMode.extend(),
              e = r.Encryptor = r.extend({
                  processBlock: function(t, r) {
                      var e = this._cipher,
                          i = e.blockSize,
                          n = this._iv,
                          o = this._counter;
                      n && (o = this._counter = n.slice(0), this._iv = void 0);
                      var s = o.slice(0);
                      e.encryptBlock(s, 0), o[i - 1] = o[i - 1] + 1 | 0;
                      for (var a = 0; a < i; a++) t[r + a] ^= s[a]
                  }
              });
          return r.Decryptor = e, r
      }(),
      function() {
          function r() {
              for (var t = this._X, r = this._C, e = 0; e < 8; e++) a[e] = r[e];
              r[0] = r[0] + 1295307597 + this._b | 0, r[1] = r[1] + 3545052371 + (r[0] >>> 0 < a[0] >>> 0 ? 1 : 0) | 0, r[2] = r[2] + 886263092 + (r[1] >>> 0 < a[1] >>> 0 ? 1 : 0) | 0, r[3] = r[3] + 1295307597 + (r[2] >>> 0 < a[2] >>> 0 ? 1 : 0) | 0, r[4] = r[4] + 3545052371 + (r[3] >>> 0 < a[3] >>> 0 ? 1 : 0) | 0, r[5] = r[5] + 886263092 + (r[4] >>> 0 < a[4] >>> 0 ? 1 : 0) | 0, r[6] = r[6] + 1295307597 + (r[5] >>> 0 < a[5] >>> 0 ? 1 : 0) | 0, r[7] = r[7] + 3545052371 + (r[6] >>> 0 < a[6] >>> 0 ? 1 : 0) | 0, this._b = r[7] >>> 0 < a[7] >>> 0 ? 1 : 0;
              for (var e = 0; e < 8; e++) {
                  var i = t[e] + r[e],
                      n = 65535 & i,
                      o = i >>> 16,
                      s = ((n * n >>> 17) + n * o >>> 15) + o * o,
                      h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0);
                  c[e] = s ^ h
              }
              t[0] = c[0] + (c[7] << 16 | c[7] >>> 16) + (c[6] << 16 | c[6] >>> 16) | 0, t[1] = c[1] + (c[0] << 8 | c[0] >>> 24) + c[7] | 0, t[2] = c[2] + (c[1] << 16 | c[1] >>> 16) + (c[0] << 16 | c[0] >>> 16) | 0, t[3] = c[3] + (c[2] << 8 | c[2] >>> 24) + c[1] | 0, t[4] = c[4] + (c[3] << 16 | c[3] >>> 16) + (c[2] << 16 | c[2] >>> 16) | 0, t[5] = c[5] + (c[4] << 8 | c[4] >>> 24) + c[3] | 0, t[6] = c[6] + (c[5] << 16 | c[5] >>> 16) + (c[4] << 16 | c[4] >>> 16) | 0, t[7] = c[7] + (c[6] << 8 | c[6] >>> 24) + c[5] | 0
          }
          var e = t,
              i = e.lib,
              n = i.StreamCipher,
              o = e.algo,
              s = [],
              a = [],
              c = [],
              h = o.RabbitLegacy = n.extend({
                  _doReset: function() {
                      var t = this._key.words,
                          e = this.cfg.iv,
                          i = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16],
                          n = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]];
                      this._b = 0;
                      for (var o = 0; o < 4; o++) r.call(this);
                      for (var o = 0; o < 8; o++) n[o] ^= i[o + 4 & 7];
                      if (e) {
                          var s = e.words,
                              a = s[0],
                              c = s[1],
                              h = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8),
                              l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8),
                              f = h >>> 16 | 4294901760 & l,
                              u = l << 16 | 65535 & h;
                          n[0] ^= h, n[1] ^= f, n[2] ^= l, n[3] ^= u, n[4] ^= h, n[5] ^= f, n[6] ^= l, n[7] ^= u;
                          for (var o = 0; o < 4; o++) r.call(this)
                      }
                  },
                  _doProcessBlock: function(t, e) {
                      var i = this._X;
                      r.call(this), s[0] = i[0] ^ i[5] >>> 16 ^ i[3] << 16, s[1] = i[2] ^ i[7] >>> 16 ^ i[5] << 16, s[2] = i[4] ^ i[1] >>> 16 ^ i[7] << 16, s[3] = i[6] ^ i[3] >>> 16 ^ i[1] << 16;
                      for (var n = 0; n < 4; n++) s[n] = 16711935 & (s[n] << 8 | s[n] >>> 24) | 4278255360 & (s[n] << 24 | s[n] >>> 8), t[e + n] ^= s[n]
                  },
                  blockSize: 4,
                  ivSize: 2
              });
          e.RabbitLegacy = n._createHelper(h)
      }(), t.pad.ZeroPadding = {
          pad: function(t, r) {
              var e = 4 * r;
              t.clamp(), t.sigBytes += e - (t.sigBytes % e || e)
          },
          unpad: function(t) {
              for (var r = t.words, e = t.sigBytes - 1; !(r[e >>> 2] >>> 24 - e % 4 * 8 & 255);) e--;
              t.sigBytes = e + 1
          }
      }, t
});
const $ = new Env('宠汪汪');
const notify = $.isNode() ? require('./sendNotify') : '';
//Node.js用户请在jdCookie.js处填写京东ck;
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
let allMessage = '';
//IOS等用户直接用NobyDa的jd cookie
let cookiesArr = [],
  cookie = '';
if ($.isNode()) {
  Object.keys(jdCookieNode).forEach((item) => {
      cookiesArr.push(jdCookieNode[item])
  })
  if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
} else {
  cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item);
}
let message = '',
  subTitle = '';
let FEED_NUM = ($.getdata('joyFeedCount') * 1) || 10; //每次喂养数量 [10,20,40,80]
let teamLevel = `2`; //参加多少人的赛跑比赛，默认是双人赛跑，可选2，10,50。其他不可选，其中2代表参加双人PK赛，10代表参加10人突围赛，50代表参加50人挑战赛，如若想设置不同账号参加不同类别的比赛则用&区分即可(如：`2&10&50`)
//是否参加宠汪汪双人赛跑（据目前观察，参加双人赛跑不消耗狗粮,如需参加其他多人赛跑，请关闭）
// 默认 'true' 参加双人赛跑，如需关闭 ，请改成 'false';
let joyRunFlag = true;
let jdNotify = true; //是否开启静默运行，默认true开启
let joyRunNotify = true; //宠汪汪赛跑获胜后是否推送通知，true推送，false不推送通知
const JD_API_HOST = 'https://jdjoy.jd.com/pet'
const weAppUrl = 'https://draw.jdfcloud.com//pet';


const https = require('https');
const http = require('http');
const stream = require('stream');
const zlib = require('zlib');
const vm = require('vm');
const {
  createCanvas,
  Image
} = require('canvas');
Math.avg = function average() {
  var sum = 0;
  var len = this.length;
  for (var i = 0; i < len; i++) {
      sum += this[i];
  }
  return sum / len;
};

function sleep(timeout) {
  return new Promise((resolve) => setTimeout(resolve, timeout));
}
const canvas = createCanvas();
const PUZZLE_GAP = 8;
const PUZZLE_PAD = 10;
class PuzzleRecognizer {
  constructor(bg, patch, y) {
      // console.log(bg);
      const imgBg = new Image();
      const imgPatch = new Image();
      imgBg.src = bg;
      imgPatch.src = patch;
      // console.log(imgBg.naturalWidth);
      this.bg = imgBg;
      this.patch = imgPatch;
      this.y = y;
      this.w = imgBg.naturalWidth;
      this.h = imgBg.naturalHeight;
      this.ctx = canvas.getContext('2d');
  }
  run() {
      const {
          ctx,
          w,
          h
      } = this;
      canvas.width = w;
      canvas.height = h;
      ctx.clearRect(0, 0, w, h);
      ctx.drawImage(this.bg, 0, 0, w, h);
      return this.recognize();
  }
  recognize() {
      const {
          ctx,
          w: width
      } = this;
      const {
          naturalHeight,
          naturalWidth
      } = this.patch;
      const posY = this.y + PUZZLE_PAD + ((naturalHeight - PUZZLE_PAD) / 2) - (PUZZLE_GAP / 2);
      // const cData = ctx.getImageData(0, a.y + 10 + 20 - 4, 360, 8).data;
      const cData = ctx.getImageData(0, posY, width, PUZZLE_GAP).data;
      const lumas = [];
      for (let x = 0; x < width; x++) {
          var sum = 0;
          // y xais
          for (let y = 0; y < PUZZLE_GAP; y++) {
              var idx = x * 4 + y * (width * 4);
              var r = cData[idx];
              var g = cData[idx + 1];
              var b = cData[idx + 2];
              var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b;
              sum += luma;
          }
          lumas.push(sum / PUZZLE_GAP);
      }
      const n = 2; // minium macroscopic image width (px)
      const margin = naturalWidth - PUZZLE_PAD;
      const diff = 20; // macroscopic brightness difference
      const radius = PUZZLE_PAD;
      for (let i = 0, len = lumas.length - 2 * 4; i < len; i++) {
          const left = (lumas[i] + lumas[i + 1]) / n;
          const right = (lumas[i + 2] + lumas[i + 3]) / n;
          const mi = margin + i;
          const mLeft = (lumas[mi] + lumas[mi + 1]) / n;
          const mRigth = (lumas[mi + 2] + lumas[mi + 3]) / n;
          if (left - right > diff && mLeft - mRigth < -diff) {
              const pieces = lumas.slice(i + 2, margin + i + 2);
              const median = pieces.sort((x1, x2) => x1 - x2)[20];
              const avg = Math.avg(pieces);
              // noise reducation
              if (median > left || median > mRigth) return;
              if (avg > 100) return;
              // console.table({left,right,mLeft,mRigth,median});
              // ctx.fillRect(i+n-radius, 0, 1, 360);
              // console.log(i+n-radius);
              return i + n - radius;
          }
      }
      // not found
      return -1;
  }
}
const DATA = {
  "appId": "17839d5db83",
  "scene": "cww",
  "product": "embed",
  "lang": "zh_CN",
};
const SERVER = 'iv.jd.com';
class JDJRValidator {
  constructor(params) {
      this.data = {};
      this.x = 0;
      this.t = Date.now();
  }
  async run() {
      const tryRecognize = async () => {
          const x = await this.recognize();
          if (x > 0) {
              return x;
          }
          // retry
          return await tryRecognize();
      };
      const puzzleX = await tryRecognize();
      // console.log(puzzleX);
      const pos = new MousePosFaker(puzzleX).run();
      const d = getCoordinate(pos);
      // console.log(pos[pos.length-1][2] -Date.now());
      // await sleep(4500);
      await sleep(pos[pos.length - 1][2] - Date.now());
      const result = await JDJRValidator.jsonp('/slide/s.html', {
          d,
          ...this.data
      });
      if (result.message === 'success') {
          console.log(result);
          $.validate = result.validate
          //console.log('JDJRValidator: %fs', (Date.now() - this.t) / 1000);
          return result.validate
      } else {
          //console.count(JSON.stringify(result));
          await this.run();
      }
  }
  async recognize() {
      const data = await JDJRValidator.jsonp('/slide/g.html', {
          e: ''
      });
      const {
          bg,
          patch,
          y
      } = data;
      const uri = 'data:image/png;base64,';
      const re = new PuzzleRecognizer(uri + bg, uri + patch, y);
      const puzzleX = re.run();
      if (puzzleX > 0) {
          this.data = {
              c: data.challenge,
              w: re.w,
              e: '',
              s: '',
              o: '',
          };
          this.x = puzzleX;
      }
      return puzzleX;
  }
  async report(n) {
      console.time('PuzzleRecognizer');
      let count = 0;
      for (let i = 0; i < n; i++) {
          const x = await this.recognize();
          if (x > 0) count++;
          if (i % 50 === 0) {
              console.log('%f\%', (i / n) * 100);
          }
      }
      console.log('successful: %f\%', (count / n) * 100);
      console.timeEnd('PuzzleRecognizer');
  }
  static jsonp(api, data = {}) {
      return new Promise((resolve, reject) => {
          const fnId = `jsonp_${String(Math.random()).replace('.', '')}`;
          const extraData = {
              callback: fnId
          };
          const query = new URLSearchParams({ ...DATA,
              ...extraData,
              ...data
          }).toString();
          const url = `http://${SERVER}${api}?${query}`;
          const headers = {
              'Accept': '*/*',
              'Accept-Encoding': 'gzip,deflate,br',
              'Accept-Language': 'zh-CN,en-US',
              'Connection': 'keep-alive',
              'Host': SERVER,
              'Cookie': $.cookie,
              'Proxy-Connection': 'keep-alive',
              'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html',
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
          };
          const req = http.get(url, {
              headers
          }, (response) => {
              let res = response;
              if (res.headers['content-encoding'] === 'gzip') {
                  const unzipStream = new stream.PassThrough();
                  stream.pipeline(response, zlib.createGunzip(), unzipStream, reject, );
                  res = unzipStream;
              }
              res.setEncoding('utf8');
              let rawData = '';
              res.on('data', (chunk) => rawData += chunk);
              res.on('end', () => {
                  try {
                      const ctx = {
                          [fnId]: (data) => ctx.data = data,
                          data: {},
                      };
                      vm.createContext(ctx);
                      vm.runInContext(rawData, ctx);
                      // console.log(ctx.data);
                      res.resume();
                      resolve(ctx.data);
                  } catch (e) {
                      reject(e);
                  }
              });
          });
          req.on('error', reject);
          req.end();
      });
  }
}

function getCoordinate(c) {
  function string10to64(d) {
      var c = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-~".split(""),
          b = c.length,
          e = +d,
          a = [];
      do {
          mod = e % b;
          e = (e - mod) / b;
          a.unshift(c[mod])
      } while (e);
      return a.join("")
  }

  function prefixInteger(a, b) {
      return (Array(b).join(0) + a).slice(-b)
  }

  function pretreatment(d, c, b) {
      var e = string10to64(Math.abs(d));
      var a = "";
      if (!b) {
          a += (d > 0 ? "1" : "0")
      }
      a += prefixInteger(e, c);
      return a
  }
  var b = new Array();
  for (var e = 0; e < c.length; e++) {
      if (e == 0) {
          b.push(pretreatment(c[e][0] < 262143 ? c[e][0] : 262143, 3, true));
          b.push(pretreatment(c[e][1] < 16777215 ? c[e][1] : 16777215, 4, true));
          b.push(pretreatment(c[e][2] < 4398046511103 ? c[e][2] : 4398046511103, 7, true))
      } else {
          var a = c[e][0] - c[e - 1][0];
          var f = c[e][1] - c[e - 1][1];
          var d = c[e][2] - c[e - 1][2];
          b.push(pretreatment(a < 4095 ? a : 4095, 2, false));
          b.push(pretreatment(f < 4095 ? f : 4095, 2, false));
          b.push(pretreatment(d < 16777215 ? d : 16777215, 4, true))
      }
  }
  return b.join("")
}
const HZ = 60;
class MousePosFaker {
  constructor(puzzleX) {
      this.x = parseInt(Math.random() * 20 + 20, 10);
      this.y = parseInt(Math.random() * 80 + 80, 10);
      this.t = Date.now();
      this.pos = [
          [this.x, this.y, this.t]
      ];
      this.minDuration = parseInt(1000 / HZ, 10);
      // this.puzzleX = puzzleX;
      this.puzzleX = puzzleX + parseInt(Math.random() * 2 - 1, 10);
      this.STEP = parseInt(Math.random() * 6 + 5, 10);
      this.DURATION = parseInt(Math.random() * 7 + 14, 10) * 100;
      // [9,1600] [10,1400]
      this.STEP = 9;
      // this.DURATION = 2000;
      console.log(this.STEP, this.DURATION);
  }
  run() {
      const perX = this.puzzleX / this.STEP;
      const perDuration = this.DURATION / this.STEP;
      const firstPos = [this.x - parseInt(Math.random() * 6, 10), this.y + parseInt(Math.random() * 11, 10), this.t];
      this.pos.unshift(firstPos);
      this.stepPos(perX, perDuration);
      this.fixPos();
      const reactTime = parseInt(60 + Math.random() * 100, 10);
      const lastIdx = this.pos.length - 1;
      const lastPos = [this.pos[lastIdx][0], this.pos[lastIdx][1], this.pos[lastIdx][2] + reactTime];
      this.pos.push(lastPos);
      return this.pos;
  }
  stepPos(x, duration) {
      let n = 0;
      const sqrt2 = Math.sqrt(2);
      for (let i = 1; i <= this.STEP; i++) {
          n += 1 / i;
      }
      for (let i = 0; i < this.STEP; i++) {
          x = this.puzzleX / (n * (i + 1));
          const currX = parseInt((Math.random() * 30 - 15) + x, 10);
          const currY = parseInt(Math.random() * 7 - 3, 10);
          const currDuration = parseInt((Math.random() * 0.4 + 0.8) * duration, 10);
          this.moveToAndCollect({
              x: currX,
              y: currY,
              duration: currDuration,
          });
      }
  }
  fixPos() {
      const actualX = this.pos[this.pos.length - 1][0] - this.pos[1][0];
      const deviation = this.puzzleX - actualX;
      if (Math.abs(deviation) > 4) {
          this.moveToAndCollect({
              x: deviation,
              y: parseInt(Math.random() * 8 - 3, 10),
              duration: 250,
          });
      }
  }
  moveToAndCollect({
      x,
      y,
      duration
  }) {
      let movedX = 0;
      let movedY = 0;
      let movedT = 0;
      const times = duration / this.minDuration;
      let perX = x / times;
      let perY = y / times;
      let padDuration = 0;
      if (Math.abs(perX) < 1) {
          padDuration = duration / Math.abs(x) - this.minDuration;
          perX = 1;
          perY = y / Math.abs(x);
      }
      while (Math.abs(movedX) < Math.abs(x)) {
          const rDuration = parseInt(padDuration + Math.random() * 16 - 4, 10);
          movedX += perX + Math.random() * 2 - 1;
          movedY += perY;
          movedT += this.minDuration + rDuration;
          const currX = parseInt(this.x + movedX, 10);
          const currY = parseInt(this.y + movedY, 10);
          const currT = this.t + movedT;
          this.pos.push([currX, currY, currT]);
      }
      this.x += x;
      this.y += y;
      this.t += Math.max(duration, movedT);
  }
}
!(async () => {
  if (!cookiesArr[0]) {
      $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', {
          "open-url": "https://bean.m.jd.com/bean/signIndex.action"
      });
      return;
  }
  for (let i = 0; i < cookiesArr.length; i++) {
      if (cookiesArr[i]) {
          cookie = cookiesArr[i];
          $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1])
          $.index = i + 1;
          $.isLogin = true;
          $.nickName = '';
          await TotalBean();
          console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
          if (!$.isLogin) {
              $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, {
                  "open-url": "https://bean.m.jd.com/bean/signIndex.action"
              });
              if ($.isNode()) {
                  await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
              }
              continue
          }
          message = '';
          subTitle = '';
          await jdJoy();
          await showMsg();
          // await joinTwoPeopleRun();
      }
  }
  if ($.isNode() && joyRunNotify === 'true' && allMessage) await notify.sendNotify(`${$.name}`, `${allMessage}`)
})().catch((e) => {
  $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
}).finally(() => {
  $.done();
})
async function jdJoy() {
  try {
      $.cookie = cookie;
      let yz = new JDJRValidator($);
      await yz.run()
      console.log($.validate)
      //$.validate='fd5fb3b6ce804150a37a3c9219f91a82'
      await getPetTaskConfig();
      if ($.getPetTaskConfigRes.success) {
          if ($.isNode()) {
              if (process.env.JOY_FEED_COUNT) {
                  if ([0, 10, 20, 40, 80].indexOf(process.env.JOY_FEED_COUNT * 1) > -1) {
                      FEED_NUM = process.env.JOY_FEED_COUNT ? process.env.JOY_FEED_COUNT * 1 : FEED_NUM;
                  } else {
                      console.log(`您输入的 JOY_FEED_COUNT 为非法数字，请重新输入`);
                  }
              }
          }
          await feedPets(FEED_NUM); //喂食
          await Promise.all([
              petTask(),
              appPetTask()
          ])
          await deskGoodsTask(); //限时货柜
          await enterRoom();
          await joinTwoPeopleRun() //参加双人赛跑
      } else {
          message += `${$.getPetTaskConfigRes.errorMessage}`;
      }
  } catch (e) {
      $.logErr(e)
  }
}
//逛商品得100积分奖励任务
async function deskGoodsTask() {
  const deskGoodsRes = await getDeskGoodDetails();
  if (deskGoodsRes && deskGoodsRes.success) {
      if (deskGoodsRes.data && deskGoodsRes.data.deskGoods) {
          const {
              deskGoods,
              taskChance,
              followCount = 0
          } = deskGoodsRes.data;
          console.log(`浏览货柜商品 ${followCount ? followCount : 0}/${taskChance}`);
          if (taskChance === followCount) return
          for (let item of deskGoods) {
              if (!item['status'] && item['sku']) {
                  await followScan(item['sku'])
              }
          }
      } else {
          console.log(`\n限时商品货架已下架`);
      }
  }
}
//参加双人赛跑
async function joinTwoPeopleRun() {
  joyRunFlag = $.getdata('joyRunFlag') ? $.getdata('joyRunFlag') : joyRunFlag;
  if ($.isNode() && process.env.JOY_RUN_FLAG) {
      joyRunFlag = process.env.JOY_RUN_FLAG;
  }
  if (`${joyRunFlag}` === 'true') {
      let teamLevelTemp = [];
      teamLevelTemp = $.isNode() ? (process.env.JOY_TEAM_LEVEL ? process.env.JOY_TEAM_LEVEL.split('&') : teamLevel.split('&')) : ($.getdata('JOY_TEAM_LEVEL') ? $.getdata('JOY_TEAM_LEVEL').split('&') : teamLevel.split('&'));
      teamLevelTemp = teamLevelTemp[$.index - 1] ? teamLevelTemp[$.index - 1] : 2;
      await getPetRace();
      console.log(`\n===以下是京东账号${$.index} ${$.nickName} ${$.petRaceResult.data.teamLimitCount || teamLevelTemp}人赛跑信息===\n`)
      if ($.petRaceResult) {
          let petRaceResult = $.petRaceResult.data.petRaceResult;
          // let raceUsers = $.petRaceResult.data.raceUsers;
          console.log(`赛跑状态：${petRaceResult}\n`);
          if (petRaceResult === 'not_participate') {
              console.log(`暂未参赛，现在为您参加${teamLevelTemp}人赛跑`);
              await runMatch(teamLevelTemp * 1);
              if ($.runMatchResult.success) {
                  await getWinCoin();
                  console.log(`${$.getWinCoinRes.data.teamLimitCount || teamLevelTemp}人赛跑参加成功\n`);
                  message += `${$.getWinCoinRes.data.teamLimitCount || teamLevelTemp}人赛跑：成功参加\n`;
                  // if ($.getWinCoinRes.data['supplyOrder']) await energySupplyStation($.getWinCoinRes.data['supplyOrder']);
                  await energySupplyStation('2');
                  // petRaceResult = $.petRaceResult.data.petRaceResult;
                  // await getRankList();
                  console.log(`双人赛跑助力请自己手动去邀请好友，脚本不带赛跑助力功能\n`);
              }
          }
          if (petRaceResult === 'unbegin') {
              console.log('比赛还未开始，请九点再来');
          }
          if (petRaceResult === 'time_over') {
              console.log('今日参赛的比赛已经结束，请明天九点再来');
          }
          if (petRaceResult === 'unreceive') {
              console.log('今日参赛的比赛已经结束，现在领取奖励');
              await getWinCoin();
              let winCoin = 0;
              if ($.getWinCoinRes && $.getWinCoinRes.success) {
                  winCoin = $.getWinCoinRes.data.winCoin;
              }
              await receiveJoyRunAward();
              console.log(`领取赛跑奖励结果：${JSON.stringify($.receiveJoyRunAwardRes)}`)
              if ($.receiveJoyRunAwardRes.success) {
                  joyRunNotify = $.isNode() ? (process.env.JOY_RUN_NOTIFY ? process.env.JOY_RUN_NOTIFY : `${joyRunNotify}`) : ($.getdata('joyRunNotify') ? $.getdata('joyRunNotify') : `${joyRunNotify}`);
                  $.msg($.name, '', `【京东账号${$.index}】${$.nickName}\n太棒了，${$.name}赛跑取得获胜\n恭喜您已获得${winCoin}积分奖励`);
                  allMessage += `京东账号${$.index}${$.nickName}\n太棒了，${$.name}赛跑取得获胜\n恭喜您已获得${winCoin}积分奖励${$.index !== cookiesArr.length ? '\n\n' : ''}`;
                  // if ($.isNode() && joyRunNotify === 'true') await notify.sendNotify(`${$.name} - 京东账号${$.index} - ${$.nickName}`, `京东账号${$.index}${$.nickName}\n太棒了，${$.name}赛跑取得获胜\n恭喜您已获得${winCoin}积分奖励`)
              }
          }
          if (petRaceResult === 'participate') {
              // if ($.getWinCoinRes.data['supplyOrder']) await energySupplyStation($.getWinCoinRes.data['supplyOrder']);
              await energySupplyStation('2');
              await getRankList();
              if ($.raceUsers && $.raceUsers.length > 0) {
                  for (let index = 0; index < $.raceUsers.length; index++) {
                      if (index === 0) {
                          console.log(`您当前里程：${$.raceUsers[index].distance}KM\n当前排名:第${$.raceUsers[index].rank}名\n将获得积分:${$.raceUsers[index].coin}\n`);
                          // message += `您当前里程：${$.raceUsers[index].distance}km\n`;
                      } else {
                          console.log(`对手 ${$.raceUsers[index].nickName} 当前里程：${$.raceUsers[index].distance}KM`);
                          // message += `对手当前里程：${$.raceUsers[index].distance}km\n`;
                      }
                  }
              }
              console.log('\n今日已参赛，下面显示应援团信息');
              await getBackupInfo();
              if ($.getBackupInfoResult.success) {
                  const {
                      currentNickName,
                      totalMembers,
                      totalDistance,
                      backupList
                  } = $.getBackupInfoResult.data;
                  console.log(`${currentNickName}的应援团信息如下\n团员：${totalMembers}个\n团员助力的里程数：${totalDistance}\n`);
                  if (backupList && backupList.length > 0) {
                      for (let item of backupList) {
                          console.log(`${item.nickName}为您助力${item.distance}km`);
                      }
                  } else {
                      console.log(`暂无好友为您助力赛跑，如需助力，请手动去邀请好友助力\n`);
                  }
              }
          }
      }
  } else {
      console.log(`您设置的是不参加双人赛跑`)
  }
}
//日常任务
async function petTask() {
  for (let item of $.getPetTaskConfigRes.datas) {
      const joinedCount = item.joinedCount || 0;
      if (item['receiveStatus'] === 'chance_full') {
          console.log(`${item.taskName} 任务已完成`)
          continue
      }
      //每日签到
      if (item['taskType'] === 'SignEveryDay') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log('每日签到未完成,需要自己手动去微信小程序【来客有礼】签到，可获得京豆奖励')
          } else if (item['receiveStatus'] === 'unreceive') {
              //已签到，领取签到后的狗粮
              const res = await getFood('SignEveryDay');
              console.log(`领取每日签到狗粮结果：${res.data}`);
          }
      }
      //每日赛跑
      if (item['taskType'] === 'race') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log('每日赛跑未完成')
          } else if (item['receiveStatus'] === 'unreceive') {
              const res = await getFood('race');
              console.log(`领取每日赛跑狗粮结果：${res.data}`);
          }
      }
      //每日兑换
      if (item['taskType'] === 'exchange') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log('每日兑换未完成')
          } else if (item['receiveStatus'] === 'unreceive') {
              const res = await getFood('exchange');
              console.log(`领取每日兑换狗粮结果：${res.data}`);
          }
      }
      //每日帮好友喂一次狗粮
      if (item['taskType'] === 'HelpFeed') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log('每日帮好友喂一次狗粮未完成')
          } else if (item['receiveStatus'] === 'unreceive') {
              const res = await getFood('HelpFeed');
              console.log(`领取每日帮好友喂一次狗粮 狗粮结果：${res.data}`);
          }
      }
      //每日喂狗粮
      if (item['taskType'] === 'FeedEveryDay') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log(`\n${item['taskName']}任务进行中\n`)
          } else if (item['receiveStatus'] === 'unreceive') {
              const res = await getFood('FeedEveryDay');
              console.log(`领取每日喂狗粮 结果：${res.data}`);
          }
      }
      //
      //邀请用户助力,领狗粮.(需手动去做任务)
      if (item['taskType'] === 'InviteUser') {
          if (item['receiveStatus'] === 'chance_left') {
              console.log('未完成,需要自己手动去邀请好友给你助力,可以获得狗粮')
          } else if (item['receiveStatus'] === 'unreceive') {
              const InviteUser = await getFood('InviteUser');
              console.log(`领取助力后的狗粮结果::${JSON.stringify(InviteUser)}`);
          }
      }
      //每日三餐
      if (item['taskType'] === 'ThreeMeals') {
          console.log('-----每日三餐-----');
          if (item['receiveStatus'] === 'unreceive') {
              const ThreeMealsRes = await getFood('ThreeMeals');
              if (ThreeMealsRes.success) {
                  if (ThreeMealsRes.errorCode === 'received') {
                      console.log(`三餐结果领取成功`)
                      message += `【三餐】领取成功，获得${ThreeMealsRes.data}g狗粮\n`;
                  }
              }
          }
      }
      //关注店铺
      if (item['taskType'] === 'FollowShop') {
          console.log('-----关注店铺-----');
          const followShops = item.followShops;
          for (let shop of followShops) {
              if (!shop.status) {
                  const followShopRes = await followShop(shop.shopId);
                  console.log(`关注店铺${shop.name}结果::${JSON.stringify(followShopRes)}`)
              }
          }
      }
      //逛会场
      if (item['taskType'] === 'ScanMarket') {
          console.log('----逛会场----');
          const scanMarketList = item.scanMarketList;
          for (let scanMarketItem of scanMarketList) {
              if (!scanMarketItem.status) {
                  const body = {
                      "marketLink": scanMarketItem.marketLink,
                      "taskType": "ScanMarket",
                      //"reqSource": "weapp"
                  };
                  const scanMarketRes = await scanMarket('scan', body);

                  console.log(`逛会场-${scanMarketItem.marketName}结果::${JSON.stringify(scanMarketRes)}`)
                  await $.wait(6000)
              }
          }
      }
      //浏览频道
      if (item['taskType'] === 'FollowChannel') {
          console.log('----浏览频道----');
          const followChannelList = item.followChannelList;
          for (let followChannelItem of followChannelList) {
              if (!followChannelItem.status) {
                  const body = {
                      "channelId": followChannelItem.channelId,
                      "taskType": "FollowChannel",
                      "reqSource": "weapp"
                  };
                  const scanMarketRes = await scanMarket('scan', body);
                  console.log(`浏览频道-${followChannelItem.channelName}结果::${JSON.stringify(scanMarketRes)}`)
                   await $.wait(11000)
              }
          }
      }
      //关注商品
      if (item['taskType'] === 'FollowGood') {
          console.log('----关注商品----');
          const followGoodList = item.followGoodList;
          for (let followGoodItem of followGoodList) {
              if (!followGoodItem.status) {
                  const body = `sku=${followGoodItem.sku}&reqSource=h5`;
                  const scanMarketRes = await scanMarket('followGood', body, 'application/x-www-form-urlencoded');
                  // const scanMarketRes = await appScanMarket('followGood', `sku=${followGoodItem.sku}&reqSource=h5`, 'application/x-www-form-urlencoded');
                  console.log(`关注商品-${followGoodItem.skuName}结果::${JSON.stringify(scanMarketRes)}`)
              }
          }
      }
      //看激励视频
      if (item['taskType'] === 'ViewVideo') {
          console.log('----浏览频道----');
          if (item.taskChance === joinedCount) {
              console.log('今日激励视频已看完')
          } else {
              for (let i = 0; i < new Array(item.taskChance - joinedCount).fill('').length; i++) {
                  console.log(`开始第${i+1}次看激励视频`);
                  const body = {
                      "taskType": "ViewVideo",
                      "reqSource": "weapp"
                  }
                  let sanVideoRes = await scanMarket('scan', body);
                  console.log(`看视频激励结果--${JSON.stringify(sanVideoRes)}`);
              }
          }
      }
  }
}
async function appPetTask() {
  await appGetPetTaskConfig();
  // console.log('$.appGetPetTaskConfigRes', $.appGetPetTaskConfigRes.success)
  if ($.appGetPetTaskConfigRes.success) {
      for (let item of $.appGetPetTaskConfigRes.datas) {
          if (item['taskType'] === 'ScanMarket' && item['receiveStatus'] === 'chance_left') {
              const scanMarketList = item.scanMarketList;
              for (let scan of scanMarketList) {
                  if (!scan.status && scan.showDest === 'h5') {
                      const body = {
                          marketLink: scan.marketLinkH5,
                          taskType: 'ScanMarket',
                          reqSource: 'h5'
                      }
                      await appScanMarket('scan', body);
                  }
              }
          }
      }
  }
}

function getDeskGoodDetails() {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/getDeskGoodDetails`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/getDeskGoodDetails?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}

function followScan(sku) {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/scan`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      const body = {
          "taskType": "ScanDeskGood",
          "reqSource": "h5",
          sku
      }
      let opt = {
          url: `//jdjoy.jd.com/common/pet/scan?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "POST",
          data: body,
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.post(taskPostUrl(url, JSON.stringify(body), reqSource, host, 'application/json'), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}
//小程序逛会场，浏览频道，关注商品API
function scanMarket(type, body, cType = 'application/json') {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/${type}`;
      const host = `draw.jdfcloud.com`;
      const reqSource = 'weapp';
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/${type}?reqSource=weapp&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "POST",
          data: body,
          credentials: "include",
          header: {
              "content-type": cType
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      if (cType === 'application/json') {
          body = JSON.stringify(body)
      }
      $.post(taskPostUrl(url, body, reqSource, host, cType), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}
//app逛会场
function appScanMarket(type, body) {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/${type}`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/${type}?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "POST",
          data: body,
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.post(taskPostUrl(url, JSON.stringify(body), reqSource, host, 'application/json'), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // data = JSON.parse(data);
                  console.log(`京东app逛会场结果::${data}`)
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}
//领取狗粮API
function getFood(type) {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/getFood?reqSource=weapp&taskType=${type}`;
      const host = `draw.jdfcloud.com`;
      const reqSource = 'weapp';
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/getFood?reqSource=weapp&taskType=${type}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}
//关注店铺api
function followShop(shopId) {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/followShop`;
      const body = `shopId=${shopId}`;
      const reqSource = 'weapp';
      const host = 'draw.jdfcloud.com';
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/followShop?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "POST",
          data: body,
          credentials: "include",
          header: {
              "content-type": "application/x-www-form-urlencoded"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.post(taskPostUrl(url, body, reqSource, host, 'application/x-www-form-urlencoded'), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve(data);
          }
      })
  })
}

function enterRoom() {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/enterRoom/h5?reqSource=weapp&invitePin=&openId=`;
      const host = `draw.jdfcloud.com`;
      const reqSource = 'weapp';
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/enterRoom/h5?reqSource=h5&invitePin=&openId=&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.post({ ...taskUrl(url, host, reqSource),
          body: '{}'
      }, (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('JSON.parse(data)', JSON.parse(data))
                  $.roomData = JSON.parse(data);
                  console.log(`现有狗粮: ${$.roomData.data.petFood}\n`)
                  subTitle = `【用户名】${$.roomData.data.pin}`
                  message = `现有积分: ${$.roomData.data.petCoin}\n现有狗粮: ${$.roomData.data.petFood}\n喂养次数: ${$.roomData.data.feedCount}\n宠物等级: ${$.roomData.data.petLevel}\n`
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}

function appGetPetTaskConfig() {
  $.appGetPetTaskConfigRes = $.getPetTaskConfigRes
  //   $.get({
  //     'url': `https://jdjoy.jd.com/common/pet/getPetTaskConfig?validate=${$.validate}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE`,
  //     'headers': {
  //         'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html?babelChannel=ttt12&lng=117.613034&lat=23.940153&sid=158ac9cc27cc3f76d5a314093599a10w&un_area=16_1341_1347_44750',
  //         'User-Agent': 'jdapp;iPhone;10.0.2;13.7;7b01d4690ef13716984dcfcf96068f36b41f6c51;network/wifi;model/iPhone8,1;addressid/1518509182;appBuild/167694;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
  //         'Cookie': cookie
  //     }
  // }, (err, resp, data) => { 
  //     try {
  //         if (err) {
  //             console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
  //         } else {
  //         	//console.log( JSON.parse(data).datas)
  //             // console.log('JSON.parse(data)', JSON.parse(data))
  //             $.appGetPetTaskConfigRes = JSON.parse(data);
  //         }
  //     } catch (e) {
  //         $.logErr(e, resp);
  //     } finally {
  //         resolve();
  //     }
  // })
  // return new Promise(resolve => {
  //     // const url = `${JD_API_HOST}/getPetTaskConfig?reqSource=h5`;
  //     const host = `jdjoy.jd.com`;
  //     const reqSource = 'h5';
  //     let opt = {
  //         url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE",
  //         // url: `//draw.jdfcloud.com/common/pet/feed?feedCount=${feedNum}&reqSource=h5`,
  //         method: "GET",
  //         data: {},
  //         credentials: "include",
  //         header: {
  //             "content-type": "application/json"
  //         }
  //     }
  //     const url = "https:" + taroRequest(opt)['url']
  //     $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
  //         try {
  //             if (err) {
  //                 console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
  //             } else {
  //                 // console.log('----', JSON.parse(data))
  //                 $.appGetPetTaskConfigRes = JSON.parse(data);
  //             }
  //         } catch (e) {
  //             $.logErr(e, resp);
  //         } finally {
  //             resolve();
  //         }
  //     })
  // })
}
//喂食
function feedPets(feedNum) {
  return new Promise(resolve => {
      console.log(`您设置的喂食数量:${FEED_NUM}g\n`);
      if (FEED_NUM === 0) {
          console.log(`跳出喂食`);
          resolve();
          return
      }
      console.log(`实际的喂食数量:${feedNum}g\n`);
      // const url = `${weAppUrl}/feed?feedCount=${feedNum}&reqSource=weapp`;
      const host = `draw.jdfcloud.com`;
      const reqSource = 'weapp';
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/feed?feedCount=${feedNum}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), async (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  data = JSON.parse(data);
                  if (data.success) {
                      if (data.errorCode === 'feed_ok') {
                          console.log('喂食成功')
                          message += `【喂食成功】消耗${feedNum}g狗粮\n`;
                      } else if (data.errorCode === 'time_error') {
                          console.log('喂食失败：您的汪汪正在食用中,请稍后再喂食')
                          message += `【喂食失败】您的汪汪正在食用中,请稍后再喂食\n`;
                      } else if (data.errorCode === 'food_insufficient') {
                          console.log(`当前喂食${feedNum}g狗粮不够, 现为您降低一档次喂食\n`)
                          if ((feedNum) === 80) {
                              feedNum = 40;
                          } else if ((feedNum) === 40) {
                              feedNum = 20;
                          } else if ((feedNum) === 20) {
                              feedNum = 10;
                          } else if ((feedNum) === 10) {
                              feedNum = 0;
                          }
                          // 如果喂食设置的数量失败, 就降低一个档次喂食.
                          if ((feedNum) !== 0) {
                              await feedPets(feedNum);
                          } else {
                              console.log('您的狗粮已不足10g')
                              message += `【喂食失败】您的狗粮已不足10g\n`;
                          }
                      } else {
                          console.log(`其他状态${data.errorCode}`)
                      }
                  }
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}

function getPetTaskConfig() {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/getPetTaskConfig?reqSource=weapp`;
      // const host = `jdjoy.jd.com`;
      // const reqSource = 'h5';
      const host = `draw.jdfcloud.com`;
      const reqSource = 'weapp';
      $.get({
          'url': `https://jdjoy.jd.com/common/pet/getPetTaskConfig?validate=${$.validate}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE`,
          'headers': {
              'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html?babelChannel=ttt12&lng=117.613034&lat=23.940153&sid=158ac9cc27cc3f76d5a314093599a10w&un_area=16_1341_1347_44750',
              'User-Agent': 'jdapp;iPhone;10.0.2;13.7;7b01d4690ef13716984dcfcf96068f36b41f6c51;network/wifi;model/iPhone8,1;addressid/1518509182;appBuild/167694;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
              'Cookie': cookie
          }
      }, (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  //console.log( JSON.parse(data).datas)
                  // console.log('JSON.parse(data)', JSON.parse(data))
                  $.getPetTaskConfigRes = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
      // const url = "https:" + taroRequest(opt)['url']
      // $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
      //     console.log(data)
      //     try {
      //         if (err) {
      //             console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
      //         } else {
      //             // console.log('JSON.parse(data)', JSON.parse(data))
      //             $.getPetTaskConfigRes = JSON.parse(data);
      //         }
      //     } catch (e) {
      //         $.logErr(e, resp);
      //     } finally {
      //         resolve();
      //     }
      // })
  })
}
//查询赛跑信息API
function getPetRace() {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/combat/detail/v2?help=false`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/combat/detail/v2?help=false&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询赛跑信息API',(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  $.petRaceResult = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//查询赛跑排行榜
function getRankList() {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/combat/getRankList`;
      $.raceUsers = [];
      let opt = {
          url: `//jdjoy.jd.com/common/pet/combat/getRankList?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, `jdjoy.jd.com`, 'h5'), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询赛跑信息API',(data))
                  data = JSON.parse(data);
                  if (data.success) {
                      $.raceUsers = data.datas;
                  }
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//参加赛跑API
function runMatch(teamLevel, timeout = 5000) {
  if (teamLevel === 10 || teamLevel === 50) timeout = 60000;
  console.log(`正在参赛中，请稍等${timeout / 1000}秒，以防多个账号匹配到统一赛场\n`)
  return new Promise(async resolve => {
      await $.wait(timeout);
      // const url = `${JD_API_HOST}/combat/match?teamLevel=${teamLevel}`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/combat/match?teamLevel=${teamLevel}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: `//draw.jdfcloud.com/common/pet/combat/match?teamLevel=${teamLevel}&reqSource=h5`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('参加赛跑API', JSON.parse(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  $.runMatchResult = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//查询应援团信息API
function getBackupInfo() {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/combat/getBackupInfo`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/combat/getBackupInfo?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询应援团信息API',(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  $.getBackupInfoResult = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//查询赛跑获得多少积分
function getWinCoin() {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/combat/detail/v2?help=false&reqSource=weapp`;
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/combat/detail/v2?help=false&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, 'draw.jdfcloud.com', `weapp`), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询应援团信息API',(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  if (data) {
                      $.getWinCoinRes = JSON.parse(data);
                  }
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//领取赛跑奖励API
function receiveJoyRunAward() {
  return new Promise(resolve => {
      // const url = `${JD_API_HOST}/combat/receive`;
      const host = `jdjoy.jd.com`;
      const reqSource = 'h5';
      let opt = {
          url: `//jdjoy.jd.com/common/pet/combat/receive?reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          // url: "//draw.jdfcloud.com/common/pet/getPetTaskConfig?reqSource=h5",
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, host, reqSource), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询应援团信息API',(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  $.receiveJoyRunAwardRes = JSON.parse(data);
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}
//能力补给站
async function energySupplyStation(showOrder) {
  let status;
  await getSupplyInfo(showOrder);
  if ($.getSupplyInfoRes && $.getSupplyInfoRes.success) {
      if ($.getSupplyInfoRes.data) {
          const {
              marketList
          } = $.getSupplyInfoRes.data;
          for (let list of marketList) {
              if (!list['status']) {
                  await scanMarket('combat/supply', {
                      showOrder,
                      'supplyType': 'scan_market',
                      'taskInfo': list.marketLink || list['marketLinkH5'],
                      'reqSource': 'weapp'
                  });
                  await getSupplyInfo(showOrder);
              } else {
                  $.log(`能力补给站 ${$.getSupplyInfoRes.data.addDistance}km里程 已领取\n`);
                  status = list['status'];
              }
          }
          if (!status) {
              await energySupplyStation(showOrder);
          }
      }
  }
}

function getSupplyInfo(showOrder) {
  return new Promise(resolve => {
      // const url = `${weAppUrl}/combat/getSupplyInfo?showOrder=${showOrder}`;
      let opt = {
          // url: "//jdjoy.jd.com/common/pet/getPetTaskConfig?reqSource=h5",
          url: `//draw.jdfcloud.com/common/pet/combat/getSupplyInfo?showOrder=${showOrder}&reqSource=h5&invokeKey=NRp8OPxZMFXmGkaE&validate=${$.validate}`,
          method: "GET",
          data: {},
          credentials: "include",
          header: {
              "content-type": "application/json"
          }
      }
      const url = "https:" + taroRequest(opt)['url']
      $.get(taskUrl(url, 'draw.jdfcloud.com', `weapp`), (err, resp, data) => {
          try {
              if (err) {
                  console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
              } else {
                  // console.log('查询应援团信息API',(data))
                  // $.appGetPetTaskConfigRes = JSON.parse(data);
                  if (data) {
                      $.getSupplyInfoRes = JSON.parse(data);
                  }
              }
          } catch (e) {
              $.logErr(e, resp);
          } finally {
              resolve();
          }
      })
  })
}

function showMsg() {
  jdNotify = $.getdata('jdJoyNotify') ? $.getdata('jdJoyNotify') : jdNotify;
  if (!jdNotify || jdNotify === 'false') {
      $.msg($.name, subTitle, message);
  } else {
      $.log(`\n${message}\n`);
  }
}

function TotalBean() {
  return new Promise(async resolve => {
      const options = {
          "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
          "headers": {
              "Accept": "application/json,text/plain, */*",
              "Content-Type": "application/x-www-form-urlencoded",
              "Accept-Encoding": "gzip, deflate, br",
              "Accept-Language": "zh-cn",
              "Connection": "keep-alive",
              "Cookie": cookie,
              "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
              "User-Agent": $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1")
          }
      }
      $.post(options, (err, resp, data) => {
          try {
              if (err) {
                  console.log(`${JSON.stringify(err)}`)
                  console.log(`${$.name} API请求失败，请检查网路重试`)
              } else {
                  if (data) {
                      data = JSON.parse(data);
                      if (data['retcode'] === 13) {
                          $.isLogin = false; //cookie过期
                          return
                      }
                      if (data['retcode'] === 0) {
                          $.nickName = (data['base'] && data['base'].nickname) || $.UserName;
                      } else {
                          $.nickName = $.UserName
                      }
                  } else {
                      console.log(`京东服务器返回空数据`)
                  }
              }
          } catch (e) {
              $.logErr(e, resp)
          } finally {
              resolve();
          }
      })
  })
}

function taskUrl(url, Host, reqSource) {
  return {
      url: url,
      headers: {
          'Cookie': cookie,
          // 'reqSource': reqSource,
          'Host': Host,
          'Connection': 'keep-alive',
          'Content-Type': 'application/json',
          'Referer': 'https://jdjoy.jd.com/pet/index',
          'User-Agent': $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1"),
          'Accept-Language': 'zh-cn',
          'Accept-Encoding': 'gzip, deflate, br',
      }
  }
}

function taskPostUrl(url, body, reqSource, Host, ContentType) {
  return {
      url: url,
      body: body,
      headers: {
          'Cookie': cookie,
          'User-Agent': $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1"),
          'reqSource': reqSource,
          'Content-Type': ContentType,
          'Host': Host,
          'Referer': 'https://jdjoy.jd.com/pet/index',
          'Accept-Language': 'zh-cn',
          'Accept-Encoding': 'gzip, deflate, br',
      }
  }
}

function jsonParse(str) {
  if (typeof str == "string") {
      try {
          return JSON.parse(str);
      } catch (e) {
          console.log(e);
          $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie')
          return [];
      }
  }
}
var __encode = 'jsjiami.com',
  _a = {},
  _0xb483 = ["\x5F\x64\x65\x63\x6F\x64\x65", "\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x6F\x6A\x73\x6F\x6E\x2E\x63\x6F\x6D\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x6F\x62\x66\x75\x73\x63\x61\x74\x6F\x72\x2E\x68\x74\x6D\x6C"];
(function(_0xd642x1) {
  _0xd642x1[_0xb483[0]] = _0xb483[1]
})(_a);
var __Oxb227b = ["\x69\x73\x4E\x6F\x64\x65", "\x63\x72\x79\x70\x74\x6F\x2D\x6A\x73", "\x39\x38\x63\x31\x34\x63\x39\x39\x37\x66\x64\x65\x35\x30\x63\x63\x31\x38\x62\x64\x65\x66\x65\x63\x66\x64\x34\x38\x63\x65\x62\x37", "\x70\x61\x72\x73\x65", "\x55\x74\x66\x38", "\x65\x6E\x63", "\x65\x61\x36\x35\x33\x66\x34\x66\x33\x63\x35\x65\x64\x61\x31\x32", "\x63\x69\x70\x68\x65\x72\x74\x65\x78\x74", "\x43\x42\x43", "\x6D\x6F\x64\x65", "\x50\x6B\x63\x73\x37", "\x70\x61\x64", "\x65\x6E\x63\x72\x79\x70\x74", "\x41\x45\x53", "\x48\x65\x78", "\x73\x74\x72\x69\x6E\x67\x69\x66\x79", "\x42\x61\x73\x65\x36\x34", "\x64\x65\x63\x72\x79\x70\x74", "\x6C\x65\x6E\x67\x74\x68", "\x6D\x61\x70", "\x73\x6F\x72\x74", "\x6B\x65\x79\x73", "\x67\x69\x66\x74", "\x70\x65\x74", "\x69\x6E\x63\x6C\x75\x64\x65\x73", "\x26", "\x6A\x6F\x69\x6E", "\x3D", "\x3F", "\x69\x6E\x64\x65\x78\x4F\x66", "\x63\x6F\x6D\x6D\x6F\x6E\x2F", "\x72\x65\x70\x6C\x61\x63\x65", "\x68\x65\x61\x64\x65\x72", "\x75\x72\x6C", "\x72\x65\x71\x53\x6F\x75\x72\x63\x65\x3D\x68\x35", "\x61\x73\x73\x69\x67\x6E", "\x6D\x65\x74\x68\x6F\x64", "\x47\x45\x54", "\x64\x61\x74\x61", "\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65", "\x6B\x65\x79\x43\x6F\x64\x65", "\x63\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65", "\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65", "", "\x67\x65\x74", "\x70\x6F\x73\x74", "\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64", "\x5F", "\x75\x6E\x64\x65\x66\x69\x6E\x65\x64", "\x6C\x6F\x67", "\u5220\u9664", "\u7248\u672C\u53F7\uFF0C\x6A\x73\u4F1A\u5B9A", "\u671F\u5F39\u7A97\uFF0C", "\u8FD8\u8BF7\u652F\u6301\u6211\u4EEC\u7684\u5DE5\u4F5C", "\x6A\x73\x6A\x69\x61", "\x6D\x69\x2E\x63\x6F\x6D"];

function taroRequest(_0x1226x2) {
  const _0x1226x3 = $[__Oxb227b[0x0]]() ? require(__Oxb227b[0x1]) : CryptoJS;
  const _0x1226x4 = __Oxb227b[0x2];
  const _0x1226x5 = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x4]][__Oxb227b[0x3]](_0x1226x4);
  const _0x1226x6 = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x4]][__Oxb227b[0x3]](__Oxb227b[0x6]);
  let _0x1226x7 = {
      "\x41\x65\x73\x45\x6E\x63\x72\x79\x70\x74": function _0x1226x8(_0x1226x2) {
          var _0x1226x9 = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x4]][__Oxb227b[0x3]](_0x1226x2);
          return _0x1226x3[__Oxb227b[0xd]][__Oxb227b[0xc]](_0x1226x9, _0x1226x5, {
              "\x69\x76": _0x1226x6,
              "\x6D\x6F\x64\x65": _0x1226x3[__Oxb227b[0x9]][__Oxb227b[0x8]],
              "\x70\x61\x64\x64\x69\x6E\x67": _0x1226x3[__Oxb227b[0xb]][__Oxb227b[0xa]]
          })[__Oxb227b[0x7]].toString()
      },
      "\x41\x65\x73\x44\x65\x63\x72\x79\x70\x74": function _0x1226xa(_0x1226x2) {
          var _0x1226x9 = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0xe]][__Oxb227b[0x3]](_0x1226x2),
              _0x1226xb = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x10]][__Oxb227b[0xf]](_0x1226x9);
          return _0x1226x3[__Oxb227b[0xd]][__Oxb227b[0x11]](_0x1226xb, _0x1226x5, {
              "\x69\x76": _0x1226x6,
              "\x6D\x6F\x64\x65": _0x1226x3[__Oxb227b[0x9]][__Oxb227b[0x8]],
              "\x70\x61\x64\x64\x69\x6E\x67": _0x1226x3[__Oxb227b[0xb]][__Oxb227b[0xa]]
          }).toString(_0x1226x3[__Oxb227b[0x5]].Utf8).toString()
      },
      "\x42\x61\x73\x65\x36\x34\x45\x6E\x63\x6F\x64\x65": function _0x1226xc(_0x1226x2) {
          var _0x1226x9 = _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x4]][__Oxb227b[0x3]](_0x1226x2);
          return _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x10]][__Oxb227b[0xf]](_0x1226x9)
      },
      "\x42\x61\x73\x65\x36\x34\x44\x65\x63\x6F\x64\x65": function _0x1226xd(_0x1226x2) {
          return _0x1226x3[__Oxb227b[0x5]][__Oxb227b[0x10]][__Oxb227b[0x3]](_0x1226x2).toString(_0x1226x3[__Oxb227b[0x5]].Utf8)
      },
      "\x4D\x64\x35\x65\x6E\x63\x6F\x64\x65": function _0x1226xe(_0x1226x2) {
          return _0x1226x3.MD5(_0x1226x2).toString()
      },
      "\x6B\x65\x79\x43\x6F\x64\x65": __Oxb227b[0x2]
  };
  const _0x1226xf = function _0x1226x10(_0x1226x2, _0x1226x9) {
      if (_0x1226x2 instanceof Array) {
          _0x1226x9 = _0x1226x9 || [];
          for (var _0x1226xb = 0; _0x1226xb < _0x1226x2[__Oxb227b[0x12]]; _0x1226xb++) {
              _0x1226x9[_0x1226xb] = _0x1226x10(_0x1226x2[_0x1226xb], _0x1226x9[_0x1226xb])
          }
      } else {
          !(_0x1226x2 instanceof Array) && _0x1226x2 instanceof Object ? (_0x1226x9 = _0x1226x9 || {}, Object[__Oxb227b[0x15]](_0x1226x2)[__Oxb227b[0x14]]()[__Oxb227b[0x13]](function(_0x1226xb) {
              _0x1226x9[_0x1226xb] = _0x1226x10(_0x1226x2[_0x1226xb], _0x1226x9[_0x1226xb])
          })) : _0x1226x9 = _0x1226x2
      };
      return _0x1226x9
  };
  const _0x1226x11 = function _0x1226x12(_0x1226x2) {
      for (var _0x1226x9 = [__Oxb227b[0x16], __Oxb227b[0x17]], _0x1226xb = !1, _0x1226x3 = 0; _0x1226x3 < _0x1226x9[__Oxb227b[0x12]]; _0x1226x3++) {
          var _0x1226x4 = _0x1226x9[_0x1226x3];
          _0x1226x2[__Oxb227b[0x18]](_0x1226x4) && !_0x1226xb && (_0x1226xb = !0)
      };
      return _0x1226xb
  };
  const _0x1226x13 = function _0x1226x14(_0x1226x2, _0x1226x9) {
      if (_0x1226x9 && Object[__Oxb227b[0x15]](_0x1226x9)[__Oxb227b[0x12]] > 0) {
          var _0x1226xb = Object[__Oxb227b[0x15]](_0x1226x9)[__Oxb227b[0x13]](function(_0x1226x2) {
              return _0x1226x2 + __Oxb227b[0x1b] + _0x1226x9[_0x1226x2]
          })[__Oxb227b[0x1a]](__Oxb227b[0x19]);
          return _0x1226x2[__Oxb227b[0x1d]](__Oxb227b[0x1c]) >= 0 ? _0x1226x2 + __Oxb227b[0x19] + _0x1226xb : _0x1226x2 + __Oxb227b[0x1c] + _0x1226xb
      };
      return _0x1226x2
  };
  const _0x1226x15 = function _0x1226x16(_0x1226x2) {
      for (var _0x1226x9 = _0x1226x6, _0x1226xb = 0; _0x1226xb < _0x1226x9[__Oxb227b[0x12]]; _0x1226xb++) {
          var _0x1226x3 = _0x1226x9[_0x1226xb];
          _0x1226x2[__Oxb227b[0x18]](_0x1226x3) && !_0x1226x2[__Oxb227b[0x18]](__Oxb227b[0x1e] + _0x1226x3) && (_0x1226x2 = _0x1226x2[__Oxb227b[0x1f]](_0x1226x3, __Oxb227b[0x1e] + _0x1226x3))
      };
      return _0x1226x2
  };
  var _0x1226x9 = _0x1226x2,
      _0x1226xb = (_0x1226x9[__Oxb227b[0x20]], _0x1226x9[__Oxb227b[0x21]]);
  _0x1226xb += (_0x1226xb[__Oxb227b[0x1d]](__Oxb227b[0x1c]) > -1 ? __Oxb227b[0x19] : __Oxb227b[0x1c]) + __Oxb227b[0x22];
  var _0x1226x17 = function _0x1226x18(_0x1226x2) {
      var _0x1226x9 = _0x1226x2[__Oxb227b[0x21]],
          _0x1226xb = _0x1226x2[__Oxb227b[0x24]],
          _0x1226x3 = void(0) === _0x1226xb ? __Oxb227b[0x25] : _0x1226xb,
          _0x1226x4 = _0x1226x2[__Oxb227b[0x26]],
          _0x1226x6 = _0x1226x2[__Oxb227b[0x20]],
          _0x1226x19 = void(0) === _0x1226x6 ? {} : _0x1226x6,
          _0x1226x1a = _0x1226x3[__Oxb227b[0x27]](),
          _0x1226x1b = _0x1226x7[__Oxb227b[0x28]],
          _0x1226x1c = _0x1226x19[__Oxb227b[0x29]] || _0x1226x19[__Oxb227b[0x2a]] || __Oxb227b[0x2b],
          _0x1226x1d = __Oxb227b[0x2b],
          _0x1226x1e = +new Date();
      return _0x1226x1d = __Oxb227b[0x2c] !== _0x1226x1a && (__Oxb227b[0x2d] !== _0x1226x1a || __Oxb227b[0x2e] !== _0x1226x1c[__Oxb227b[0x27]]() && _0x1226x4 && Object[__Oxb227b[0x15]](_0x1226x4)[__Oxb227b[0x12]]) ? _0x1226x7.Md5encode(_0x1226x7.Base64Encode(_0x1226x7.AesEncrypt(__Oxb227b[0x2b] + JSON[__Oxb227b[0xf]](_0x1226xf(_0x1226x4)))) + __Oxb227b[0x2f] + _0x1226x1b + __Oxb227b[0x2f] + _0x1226x1e) : _0x1226x7.Md5encode(__Oxb227b[0x2f] + _0x1226x1b + __Oxb227b[0x2f] + _0x1226x1e), _0x1226x11(_0x1226x9) && (_0x1226x9 = _0x1226x13(_0x1226x9, {
          "\x6C\x6B\x73": _0x1226x1d,
          "\x6C\x6B\x74": _0x1226x1e
      }), _0x1226x9 = _0x1226x15(_0x1226x9)), Object[__Oxb227b[0x23]](_0x1226x2, {
          "\x75\x72\x6C": _0x1226x9
      })
  }(_0x1226x2 = Object[__Oxb227b[0x23]](_0x1226x2, {
      "\x75\x72\x6C": _0x1226xb
  }));
  return _0x1226x17
}(function(_0x1226x1f, _0x1226xf, _0x1226x20, _0x1226x21, _0x1226x1c, _0x1226x22) {
  _0x1226x22 = __Oxb227b[0x30];
  _0x1226x21 = function(_0x1226x19) {
      if (typeof alert !== _0x1226x22) {
          alert(_0x1226x19)
      };
      if (typeof console !== _0x1226x22) {
          console[__Oxb227b[0x31]](_0x1226x19)
      }
  };
  _0x1226x20 = function(_0x1226x3, _0x1226x1f) {
      return _0x1226x3 + _0x1226x1f
  };
  _0x1226x1c = _0x1226x20(__Oxb227b[0x32], _0x1226x20(_0x1226x20(__Oxb227b[0x33], __Oxb227b[0x34]), __Oxb227b[0x35]));
  try {
      _0x1226x1f = __encode;
      if (!(typeof _0x1226x1f !== _0x1226x22 && _0x1226x1f === _0x1226x20(__Oxb227b[0x36], __Oxb227b[0x37]))) {
          _0x1226x21(_0x1226x1c)
      }
  } catch (e) {
      _0x1226x21(_0x1226x1c)
  }
})({})
// prettier-ignore
function Env(t, e) {
  "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0);
  class s {
      constructor(t) {
          this.env = t
      }
      send(t, e = "GET") {
          t = "string" == typeof t ? {
              url: t
          } : t;
          let s = this.get;
          return "POST" === e && (s = this.post), new Promise((e, i) => {
              s.call(this, t, (t, s, r) => {
                  t ? i(t) : e(s)
              })
          })
      }
      get(t) {
          return this.send.call(this.env, t)
      }
      post(t) {
          return this.send.call(this.env, t, "POST")
      }
  }
  return new class {
      constructor(t, e) {
          this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`)
      }
      isNode() {
          return "undefined" != typeof module && !!module.exports
      }
      isQuanX() {
          return "undefined" != typeof $task
      }
      isSurge() {
          return "undefined" != typeof $httpClient && "undefined" == typeof $loon
      }
      isLoon() {
          return "undefined" != typeof $loon
      }
      toObj(t, e = null) {
          try {
              return JSON.parse(t)
          } catch {
              return e
          }
      }
      toStr(t, e = null) {
          try {
              return JSON.stringify(t)
          } catch {
              return e
          }
      }
      getjson(t, e) {
          let s = e;
          const i = this.getdata(t);
          if (i) try {
              s = JSON.parse(this.getdata(t))
          } catch {}
          return s
      }
      setjson(t, e) {
          try {
              return this.setdata(JSON.stringify(t), e)
          } catch {
              return !1
          }
      }
      getScript(t) {
          return new Promise(e => {
              this.get({
                  url: t
              }, (t, s, i) => e(i))
          })
      }
      runScript(t, e) {
          return new Promise(s => {
              let i = this.getdata("@chavy_boxjs_userCfgs.httpapi");
              i = i ? i.replace(/\n/g, "").trim() : i;
              let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
              r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r;
              const [o, h] = i.split("@"), n = {
                  url: `http://${h}/v1/scripting/evaluate`,
                  body: {
                      script_text: t,
                      mock_type: "cron",
                      timeout: r
                  },
                  headers: {
                      "X-Key": o,
                      Accept: "*/*"
                  }
              };
              this.post(n, (t, e, i) => s(i))
          }).catch(t => this.logErr(t))
      }
      loaddata() {
          if (!this.isNode()) return {}; {
              this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path");
              const t = this.path.resolve(this.dataFile),
                  e = this.path.resolve(process.cwd(), this.dataFile),
                  s = this.fs.existsSync(t),
                  i = !s && this.fs.existsSync(e);
              if (!s && !i) return {}; {
                  const i = s ? t : e;
                  try {
                      return JSON.parse(this.fs.readFileSync(i))
                  } catch (t) {
                      return {}
                  }
              }
          }
      }
      writedata() {
          if (this.isNode()) {
              this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path");
              const t = this.path.resolve(this.dataFile),
                  e = this.path.resolve(process.cwd(), this.dataFile),
                  s = this.fs.existsSync(t),
                  i = !s && this.fs.existsSync(e),
                  r = JSON.stringify(this.data);
              s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r)
          }
      }
      lodash_get(t, e, s) {
          const i = e.replace(/\[(\d+)\]/g, ".$1").split(".");
          let r = t;
          for (const t of i)
              if (r = Object(r)[t], void 0 === r) return s;
          return r
      }
      lodash_set(t, e, s) {
          return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t)
      }
      getdata(t) {
          let e = this.getval(t);
          if (/^@/.test(t)) {
              const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : "";
              if (r) try {
                  const t = JSON.parse(r);
                  e = t ? this.lodash_get(t, i, "") : e
              } catch (t) {
                  e = ""
              }
          }
          return e
      }
      setdata(t, e) {
          let s = !1;
          if (/^@/.test(e)) {
              const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e), o = this.getval(i), h = i ? "null" === o ? null : o || "{}" : "{}";
              try {
                  const e = JSON.parse(h);
                  this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), i)
              } catch (e) {
                  const o = {};
                  this.lodash_set(o, r, t), s = this.setval(JSON.stringify(o), i)
              }
          } else s = this.setval(t, e);
          return s
      }
      getval(t) {
          return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null
      }
      setval(t, e) {
          return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null
      }
      initGotEnv(t) {
          this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar))
      }
      get(t, e = (() => {})) {
          t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
              "X-Surge-Skip-Scripting": !1
          })), $httpClient.get(t, (t, s, i) => {
              !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i)
          })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
              hints: !1
          })), $task.fetch(t).then(t => {
              const {
                  statusCode: s,
                  statusCode: i,
                  headers: r,
                  body: o
              } = t;
              e(null, {
                  status: s,
                  statusCode: i,
                  headers: r,
                  body: o
              }, o)
          }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => {
              try {
                  if (t.headers["set-cookie"]) {
                      const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();
                      s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar
                  }
              } catch (t) {
                  this.logErr(t)
              }
          }).then(t => {
              const {
                  statusCode: s,
                  statusCode: i,
                  headers: r,
                  body: o
              } = t;
              e(null, {
                  status: s,
                  statusCode: i,
                  headers: r,
                  body: o
              }, o)
          }, t => {
              const {
                  message: s,
                  response: i
              } = t;
              e(s, i, i && i.body)
          }))
      }
      post(t, e = (() => {})) {
          if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
              "X-Surge-Skip-Scripting": !1
          })), $httpClient.post(t, (t, s, i) => {
              !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i)
          });
          else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
              hints: !1
          })), $task.fetch(t).then(t => {
              const {
                  statusCode: s,
                  statusCode: i,
                  headers: r,
                  body: o
              } = t;
              e(null, {
                  status: s,
                  statusCode: i,
                  headers: r,
                  body: o
              }, o)
          }, t => e(t));
          else if (this.isNode()) {
              this.initGotEnv(t);
              const {
                  url: s,
                  ...i
              } = t;
              this.got.post(s, i).then(t => {
                  const {
                      statusCode: s,
                      statusCode: i,
                      headers: r,
                      body: o
                  } = t;
                  e(null, {
                      status: s,
                      statusCode: i,
                      headers: r,
                      body: o
                  }, o)
              }, t => {
                  const {
                      message: s,
                      response: i
                  } = t;
                  e(s, i, i && i.body)
              })
          }
      }
      time(t, e = null) {
          const s = e ? new Date(e) : new Date;
          let i = {
              "M+": s.getMonth() + 1,
              "d+": s.getDate(),
              "H+": s.getHours(),
              "m+": s.getMinutes(),
              "s+": s.getSeconds(),
              "q+": Math.floor((s.getMonth() + 3) / 3),
              S: s.getMilliseconds()
          };
          /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length)));
          for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length)));
          return t
      }
      msg(e = t, s = "", i = "", r) {
          const o = t => {
              if (!t) return t;
              if ("string" == typeof t) return this.isLoon() ? t : this.isQuanX() ? {
                  "open-url": t
              } : this.isSurge() ? {
                  url: t
              } : void 0;
              if ("object" == typeof t) {
                  if (this.isLoon()) {
                      let e = t.openUrl || t.url || t["open-url"],
                          s = t.mediaUrl || t["media-url"];
                      return {
                          openUrl: e,
                          mediaUrl: s
                      }
                  }
                  if (this.isQuanX()) {
                      let e = t["open-url"] || t.url || t.openUrl,
                          s = t["media-url"] || t.mediaUrl;
                      return {
                          "open-url": e,
                          "media-url": s
                      }
                  }
                  if (this.isSurge()) {
                      let e = t.url || t.openUrl || t["open-url"];
                      return {
                          url: e
                      }
                  }
              }
          };
          if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) {
              let t = ["", "==============📣系统通知📣=============="];
              t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t)
          }
      }
      log(...t) {
          t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator))
      }
      logErr(t, e) {
          const s = !this.isSurge() && !this.isQuanX() && !this.isLoon();
          s ? this.log("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t)
      }
      wait(t) {
          return new Promise(e => setTimeout(e, t))
      }
      done(t = {}) {
          const e = (new Date).getTime(),
              s = (e - this.startTime) / 1e3;
          this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t)
      }
  }(t, e)
}